//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS PinpointSMSVoiceV2 service.
///
/// Welcome to the AWS End User Messaging SMS and Voice, version 2 API Reference. This guide provides information about AWS End User Messaging SMS and Voice, version 2 API resources, including supported HTTP methods, parameters, and schemas. Amazon Pinpoint is an Amazon Web Services service that you can use to engage with your recipients across multiple messaging channels. The AWS End User Messaging SMS and Voice, version 2 API provides programmatic access to options that are unique to the SMS and voice channels. AWS End User Messaging SMS and Voice, version 2 resources such as phone numbers, sender IDs, and opt-out lists can be used by the Amazon Pinpoint API. If you're new to AWS End User Messaging SMS and Voice, it's also helpful to review the  AWS End User Messaging SMS User Guide. The AWS End User Messaging SMS User Guide  provides tutorials, code samples, and procedures that demonstrate how to use AWS End User Messaging SMS and Voice features programmatically and how to integrate functionality into mobile apps and other types of applications. The guide also provides key information, such as AWS End User Messaging SMS and Voice integration with other Amazon Web Services services, and the quotas that apply to use of the service.  Regional availability  The AWS End User Messaging SMS and Voice version 2 API Reference is available in several Amazon Web Services Regions and it provides an endpoint for each of these Regions. For a list of all the Regions and endpoints where the API is currently available, see Amazon Web Services Service Endpoints and Amazon Pinpoint endpoints and quotas in the Amazon Web Services General Reference. To learn more about Amazon Web Services Regions, see Managing Amazon Web Services Regions in the Amazon Web Services General Reference. In each Region, Amazon Web Services maintains multiple Availability Zones. These Availability Zones are physically isolated from each other, but are united by private, low-latency, high-throughput, and highly redundant network connections. These Availability Zones enable us to provide very high levels of availability and redundancy, while also minimizing latency. To learn more about the number of Availability Zones that are available in each Region, see Amazon Web Services Global Infrastructure.
public struct PinpointSMSVoiceV2: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the PinpointSMSVoiceV2 client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            amzTarget: "PinpointSMSVoiceV2",
            serviceName: "PinpointSMSVoiceV2",
            serviceIdentifier: "sms-voice",
            serviceProtocol: .json(version: "1.0"),
            apiVersion: "2022-03-31",
            endpoint: endpoint,
            variantEndpoints: Self.variantEndpoints,
            errorType: PinpointSMSVoiceV2ErrorType.self,
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }




    /// FIPS and dualstack endpoints
    static var variantEndpoints: [EndpointVariantType: AWSServiceConfig.EndpointVariant] {[
        [.dualstack]: .init(endpoints: [
            "af-south-1": "sms-voice.af-south-1.api.aws",
            "ap-northeast-1": "sms-voice.ap-northeast-1.api.aws",
            "ap-northeast-2": "sms-voice.ap-northeast-2.api.aws",
            "ap-northeast-3": "sms-voice.ap-northeast-3.api.aws",
            "ap-south-1": "sms-voice.ap-south-1.api.aws",
            "ap-south-2": "sms-voice.ap-south-2.api.aws",
            "ap-southeast-1": "sms-voice.ap-southeast-1.api.aws",
            "ap-southeast-2": "sms-voice.ap-southeast-2.api.aws",
            "ap-southeast-3": "sms-voice.ap-southeast-3.api.aws",
            "ap-southeast-4": "sms-voice.ap-southeast-4.api.aws",
            "ca-central-1": "sms-voice.ca-central-1.api.aws",
            "ca-west-1": "sms-voice.ca-west-1.api.aws",
            "eu-central-1": "sms-voice.eu-central-1.api.aws",
            "eu-central-2": "sms-voice.eu-central-2.api.aws",
            "eu-north-1": "sms-voice.eu-north-1.api.aws",
            "eu-south-1": "sms-voice.eu-south-1.api.aws",
            "eu-south-2": "sms-voice.eu-south-2.api.aws",
            "eu-west-1": "sms-voice.eu-west-1.api.aws",
            "eu-west-2": "sms-voice.eu-west-2.api.aws",
            "eu-west-3": "sms-voice.eu-west-3.api.aws",
            "il-central-1": "sms-voice.il-central-1.api.aws",
            "me-central-1": "sms-voice.me-central-1.api.aws",
            "me-south-1": "sms-voice.me-south-1.api.aws",
            "sa-east-1": "sms-voice.sa-east-1.api.aws",
            "us-east-1": "sms-voice.us-east-1.api.aws",
            "us-east-2": "sms-voice.us-east-2.api.aws",
            "us-gov-east-1": "sms-voice.us-gov-east-1.api.aws",
            "us-gov-west-1": "sms-voice.us-gov-west-1.api.aws",
            "us-west-1": "sms-voice.us-west-1.api.aws",
            "us-west-2": "sms-voice.us-west-2.api.aws"
        ]),
        [.dualstack, .fips]: .init(endpoints: [
            "ca-central-1": "sms-voice-fips.ca-central-1.api.aws",
            "ca-west-1": "sms-voice-fips.ca-west-1.api.aws",
            "us-east-1": "sms-voice-fips.us-east-1.api.aws",
            "us-east-2": "sms-voice-fips.us-east-2.api.aws",
            "us-gov-east-1": "sms-voice-fips.us-gov-east-1.api.aws",
            "us-gov-west-1": "sms-voice-fips.us-gov-west-1.api.aws",
            "us-west-1": "sms-voice-fips.us-west-1.api.aws",
            "us-west-2": "sms-voice-fips.us-west-2.api.aws"
        ]),
        [.fips]: .init(endpoints: [
            "ca-central-1": "sms-voice-fips.ca-central-1.amazonaws.com",
            "ca-west-1": "sms-voice-fips.ca-west-1.amazonaws.com",
            "us-east-1": "sms-voice-fips.us-east-1.amazonaws.com",
            "us-east-2": "sms-voice-fips.us-east-2.amazonaws.com",
            "us-gov-east-1": "sms-voice-fips.us-gov-east-1.amazonaws.com",
            "us-gov-west-1": "sms-voice-fips.us-gov-west-1.amazonaws.com",
            "us-west-1": "sms-voice-fips.us-west-1.amazonaws.com",
            "us-west-2": "sms-voice-fips.us-west-2.amazonaws.com"
        ])
    ]}

    // MARK: API Calls

    /// Associates the specified origination identity with a pool. If the origination identity is a phone number and is already associated with another pool, an error is returned. A sender ID can be associated with multiple pools. If the origination identity configuration doesn't match the pool's configuration, an error is returned.
    @Sendable
    @inlinable
    public func associateOriginationIdentity(_ input: AssociateOriginationIdentityRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> AssociateOriginationIdentityResult {
        try await self.client.execute(
            operation: "AssociateOriginationIdentity", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Associates the specified origination identity with a pool. If the origination identity is a phone number and is already associated with another pool, an error is returned. A sender ID can be associated with multiple pools. If the origination identity configuration doesn't match the pool's configuration, an error is returned.
    ///
    /// Parameters:
    ///   - clientToken: Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you don't specify a client token, a randomly generated token is used for the request to ensure idempotency.
    ///   - isoCountryCode: The new two-character code, in ISO 3166-1 alpha-2 format, for the country or region of the origination identity.
    ///   - originationIdentity: The origination identity to use, such as PhoneNumberId, PhoneNumberArn, SenderId, or SenderIdArn. You can use DescribePhoneNumbers to find the values for PhoneNumberId and PhoneNumberArn, while DescribeSenderIds can be used to get the values for SenderId and SenderIdArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - poolId: The pool to update with the new Identity. This value can be either the PoolId or PoolArn, and you can find these values using DescribePools.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - logger: Logger use during operation
    @inlinable
    public func associateOriginationIdentity(
        clientToken: String? = AssociateOriginationIdentityRequest.idempotencyToken(),
        isoCountryCode: String,
        originationIdentity: String,
        poolId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> AssociateOriginationIdentityResult {
        let input = AssociateOriginationIdentityRequest(
            clientToken: clientToken, 
            isoCountryCode: isoCountryCode, 
            originationIdentity: originationIdentity, 
            poolId: poolId
        )
        return try await self.associateOriginationIdentity(input, logger: logger)
    }

    /// Associate a protect configuration with a configuration set. This replaces the configuration sets current protect configuration. A configuration set can only be associated with one protect configuration at a time. A protect configuration can be associated with multiple configuration sets.
    @Sendable
    @inlinable
    public func associateProtectConfiguration(_ input: AssociateProtectConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> AssociateProtectConfigurationResult {
        try await self.client.execute(
            operation: "AssociateProtectConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Associate a protect configuration with a configuration set. This replaces the configuration sets current protect configuration. A configuration set can only be associated with one protect configuration at a time. A protect configuration can be associated with multiple configuration sets.
    ///
    /// Parameters:
    ///   - configurationSetName: The name of the ConfigurationSet.
    ///   - protectConfigurationId: The unique identifier for the protect configuration.
    ///   - logger: Logger use during operation
    @inlinable
    public func associateProtectConfiguration(
        configurationSetName: String,
        protectConfigurationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> AssociateProtectConfigurationResult {
        let input = AssociateProtectConfigurationRequest(
            configurationSetName: configurationSetName, 
            protectConfigurationId: protectConfigurationId
        )
        return try await self.associateProtectConfiguration(input, logger: logger)
    }

    /// Creates a new configuration set. After you create the configuration set, you can add one or more event destinations to it. A configuration set is a set of rules that you apply to the SMS and voice messages that you send. When you send a message, you can optionally specify a single configuration set.
    @Sendable
    @inlinable
    public func createConfigurationSet(_ input: CreateConfigurationSetRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateConfigurationSetResult {
        try await self.client.execute(
            operation: "CreateConfigurationSet", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new configuration set. After you create the configuration set, you can add one or more event destinations to it. A configuration set is a set of rules that you apply to the SMS and voice messages that you send. When you send a message, you can optionally specify a single configuration set.
    ///
    /// Parameters:
    ///   - clientToken: Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you don't specify a client token, a randomly generated token is used for the request to ensure idempotency.
    ///   - configurationSetName: The name to use for the new configuration set.
    ///   - tags: An array of key and value pair tags that's associated with the new configuration set.
    ///   - logger: Logger use during operation
    @inlinable
    public func createConfigurationSet(
        clientToken: String? = CreateConfigurationSetRequest.idempotencyToken(),
        configurationSetName: String,
        tags: [Tag]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateConfigurationSetResult {
        let input = CreateConfigurationSetRequest(
            clientToken: clientToken, 
            configurationSetName: configurationSetName, 
            tags: tags
        )
        return try await self.createConfigurationSet(input, logger: logger)
    }

    /// Creates a new event destination in a configuration set. An event destination is a location where you send message events. The event options are Amazon CloudWatch, Amazon Data Firehose, or Amazon SNS. For example, when a message is delivered successfully, you can send information about that event to an event destination, or send notifications to endpoints that are subscribed to an Amazon SNS topic.  You can only create one event destination at a time. You must provide a value for a single event destination using either CloudWatchLogsDestination, KinesisFirehoseDestination or SnsDestination. If an event destination isn't provided then an exception is returned. Each configuration set can contain between 0 and 5 event destinations. Each event destination can contain a reference to a single destination, such as a CloudWatch or Firehose destination.
    @Sendable
    @inlinable
    public func createEventDestination(_ input: CreateEventDestinationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateEventDestinationResult {
        try await self.client.execute(
            operation: "CreateEventDestination", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new event destination in a configuration set. An event destination is a location where you send message events. The event options are Amazon CloudWatch, Amazon Data Firehose, or Amazon SNS. For example, when a message is delivered successfully, you can send information about that event to an event destination, or send notifications to endpoints that are subscribed to an Amazon SNS topic.  You can only create one event destination at a time. You must provide a value for a single event destination using either CloudWatchLogsDestination, KinesisFirehoseDestination or SnsDestination. If an event destination isn't provided then an exception is returned. Each configuration set can contain between 0 and 5 event destinations. Each event destination can contain a reference to a single destination, such as a CloudWatch or Firehose destination.
    ///
    /// Parameters:
    ///   - clientToken: Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you don't specify a client token, a randomly generated token is used for the request to ensure idempotency.
    ///   - cloudWatchLogsDestination: An object that contains information about an event destination for logging to Amazon CloudWatch Logs.
    ///   - configurationSetName: Either the name of the configuration set or the configuration set ARN to apply event logging to. The ConfigurateSetName and ConfigurationSetArn can be found using the DescribeConfigurationSets action.
    ///   - eventDestinationName: The name that identifies the event destination.
    ///   - kinesisFirehoseDestination: An object that contains information about an event destination for logging to Amazon Data Firehose.
    ///   - matchingEventTypes: An array of event types that determine which events to log. If "ALL" is used, then AWS End User Messaging SMS and Voice logs every event type.  The TEXT_SENT event type is not supported.
    ///   - snsDestination: An object that contains information about an event destination for logging to Amazon SNS.
    ///   - logger: Logger use during operation
    @inlinable
    public func createEventDestination(
        clientToken: String? = CreateEventDestinationRequest.idempotencyToken(),
        cloudWatchLogsDestination: CloudWatchLogsDestination? = nil,
        configurationSetName: String,
        eventDestinationName: String,
        kinesisFirehoseDestination: KinesisFirehoseDestination? = nil,
        matchingEventTypes: [EventType],
        snsDestination: SnsDestination? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateEventDestinationResult {
        let input = CreateEventDestinationRequest(
            clientToken: clientToken, 
            cloudWatchLogsDestination: cloudWatchLogsDestination, 
            configurationSetName: configurationSetName, 
            eventDestinationName: eventDestinationName, 
            kinesisFirehoseDestination: kinesisFirehoseDestination, 
            matchingEventTypes: matchingEventTypes, 
            snsDestination: snsDestination
        )
        return try await self.createEventDestination(input, logger: logger)
    }

    /// Creates a new opt-out list. If the opt-out list name already exists, an error is returned. An opt-out list is a list of phone numbers that are opted out, meaning you can't send SMS or voice messages to them. If end user replies with the keyword "STOP," an entry for the phone number is added to the opt-out list. In addition to STOP, your recipients can use any supported opt-out keyword, such as CANCEL or OPTOUT. For a list of supported opt-out keywords, see  SMS opt out  in the AWS End User Messaging SMS User Guide.
    @Sendable
    @inlinable
    public func createOptOutList(_ input: CreateOptOutListRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateOptOutListResult {
        try await self.client.execute(
            operation: "CreateOptOutList", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new opt-out list. If the opt-out list name already exists, an error is returned. An opt-out list is a list of phone numbers that are opted out, meaning you can't send SMS or voice messages to them. If end user replies with the keyword "STOP," an entry for the phone number is added to the opt-out list. In addition to STOP, your recipients can use any supported opt-out keyword, such as CANCEL or OPTOUT. For a list of supported opt-out keywords, see  SMS opt out  in the AWS End User Messaging SMS User Guide.
    ///
    /// Parameters:
    ///   - clientToken: Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you don't specify a client token, a randomly generated token is used for the request to ensure idempotency.
    ///   - optOutListName: The name of the new OptOutList.
    ///   - tags: An array of tags (key and value pairs) to associate with the new OptOutList.
    ///   - logger: Logger use during operation
    @inlinable
    public func createOptOutList(
        clientToken: String? = CreateOptOutListRequest.idempotencyToken(),
        optOutListName: String,
        tags: [Tag]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateOptOutListResult {
        let input = CreateOptOutListRequest(
            clientToken: clientToken, 
            optOutListName: optOutListName, 
            tags: tags
        )
        return try await self.createOptOutList(input, logger: logger)
    }

    /// Creates a new pool and associates the specified origination identity to the pool. A pool can include one or more phone numbers and SenderIds that are associated with your Amazon Web Services account. The new pool inherits its configuration from the specified origination identity. This includes keywords, message type, opt-out list, two-way configuration, and self-managed opt-out configuration. Deletion protection isn't inherited from the origination identity and defaults to false. If the origination identity is a phone number and is already associated with another pool, an error is returned. A sender ID can be associated with multiple pools.
    @Sendable
    @inlinable
    public func createPool(_ input: CreatePoolRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreatePoolResult {
        try await self.client.execute(
            operation: "CreatePool", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new pool and associates the specified origination identity to the pool. A pool can include one or more phone numbers and SenderIds that are associated with your Amazon Web Services account. The new pool inherits its configuration from the specified origination identity. This includes keywords, message type, opt-out list, two-way configuration, and self-managed opt-out configuration. Deletion protection isn't inherited from the origination identity and defaults to false. If the origination identity is a phone number and is already associated with another pool, an error is returned. A sender ID can be associated with multiple pools.
    ///
    /// Parameters:
    ///   - clientToken: Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you don't specify a client token, a randomly generated token is used for the request to ensure idempotency.
    ///   - deletionProtectionEnabled: By default this is set to false. When set to true the pool can't be deleted. You can change this value using the UpdatePool action.
    ///   - isoCountryCode: The new two-character code, in ISO 3166-1 alpha-2 format, for the country or region of the new pool.
    ///   - messageType: The type of message. Valid values are TRANSACTIONAL for messages that are critical or time-sensitive and PROMOTIONAL for messages that aren't critical or time-sensitive. After the pool is created the MessageType can't be changed.
    ///   - originationIdentity: The origination identity to use such as a PhoneNumberId, PhoneNumberArn, SenderId or SenderIdArn. You can use DescribePhoneNumbers to find the values for PhoneNumberId and PhoneNumberArn while DescribeSenderIds can be used to get the values for SenderId and SenderIdArn. After the pool is created you can add more origination identities to the pool by using AssociateOriginationIdentity.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - tags: An array of tags (key and value pairs) associated with the pool.
    ///   - logger: Logger use during operation
    @inlinable
    public func createPool(
        clientToken: String? = CreatePoolRequest.idempotencyToken(),
        deletionProtectionEnabled: Bool? = nil,
        isoCountryCode: String,
        messageType: MessageType,
        originationIdentity: String,
        tags: [Tag]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreatePoolResult {
        let input = CreatePoolRequest(
            clientToken: clientToken, 
            deletionProtectionEnabled: deletionProtectionEnabled, 
            isoCountryCode: isoCountryCode, 
            messageType: messageType, 
            originationIdentity: originationIdentity, 
            tags: tags
        )
        return try await self.createPool(input, logger: logger)
    }

    /// Create a new protect configuration. By default all country rule sets for each capability are set to ALLOW. Update the country rule sets using UpdateProtectConfigurationCountryRuleSet. A protect configurations name is stored as a Tag with the key set to Name and value as the name of the protect configuration.
    @Sendable
    @inlinable
    public func createProtectConfiguration(_ input: CreateProtectConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateProtectConfigurationResult {
        try await self.client.execute(
            operation: "CreateProtectConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Create a new protect configuration. By default all country rule sets for each capability are set to ALLOW. Update the country rule sets using UpdateProtectConfigurationCountryRuleSet. A protect configurations name is stored as a Tag with the key set to Name and value as the name of the protect configuration.
    ///
    /// Parameters:
    ///   - clientToken: Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you don't specify a client token, a randomly generated token is used for the request to ensure idempotency.
    ///   - deletionProtectionEnabled: When set to true deletion protection is enabled. By default this is set to false.
    ///   - tags: An array of key and value pair tags that are associated with the resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func createProtectConfiguration(
        clientToken: String? = CreateProtectConfigurationRequest.idempotencyToken(),
        deletionProtectionEnabled: Bool? = nil,
        tags: [Tag]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateProtectConfigurationResult {
        let input = CreateProtectConfigurationRequest(
            clientToken: clientToken, 
            deletionProtectionEnabled: deletionProtectionEnabled, 
            tags: tags
        )
        return try await self.createProtectConfiguration(input, logger: logger)
    }

    /// Creates a new registration based on the RegistrationType field.
    @Sendable
    @inlinable
    public func createRegistration(_ input: CreateRegistrationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateRegistrationResult {
        try await self.client.execute(
            operation: "CreateRegistration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new registration based on the RegistrationType field.
    ///
    /// Parameters:
    ///   - clientToken: Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you don't specify a client token, a randomly generated token is used for the request to ensure idempotency.
    ///   - registrationType: The type of registration form to create. The list of RegistrationTypes can be found using the DescribeRegistrationTypeDefinitions action.
    ///   - tags: An array of tags (key and value pairs) to associate with the registration.
    ///   - logger: Logger use during operation
    @inlinable
    public func createRegistration(
        clientToken: String? = CreateRegistrationRequest.idempotencyToken(),
        registrationType: String,
        tags: [Tag]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateRegistrationResult {
        let input = CreateRegistrationRequest(
            clientToken: clientToken, 
            registrationType: registrationType, 
            tags: tags
        )
        return try await self.createRegistration(input, logger: logger)
    }

    /// Associate the registration with an origination identity such as a phone number or sender ID.
    @Sendable
    @inlinable
    public func createRegistrationAssociation(_ input: CreateRegistrationAssociationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateRegistrationAssociationResult {
        try await self.client.execute(
            operation: "CreateRegistrationAssociation", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Associate the registration with an origination identity such as a phone number or sender ID.
    ///
    /// Parameters:
    ///   - registrationId: The unique identifier for the registration.
    ///   - resourceId: The unique identifier for the origination identity. For example this could be a PhoneNumberId or SenderId.
    ///   - logger: Logger use during operation
    @inlinable
    public func createRegistrationAssociation(
        registrationId: String,
        resourceId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateRegistrationAssociationResult {
        let input = CreateRegistrationAssociationRequest(
            registrationId: registrationId, 
            resourceId: resourceId
        )
        return try await self.createRegistrationAssociation(input, logger: logger)
    }

    /// Create a new registration attachment to use for uploading a file or a URL to a file. The maximum file size is 500KB and valid file extensions are PDF, JPEG and PNG. For example, many sender ID registrations require a signed “letter of authorization” (LOA) to be submitted. Use either AttachmentUrl or AttachmentBody to upload your attachment. If both are specified then an exception is returned.
    @Sendable
    @inlinable
    public func createRegistrationAttachment(_ input: CreateRegistrationAttachmentRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateRegistrationAttachmentResult {
        try await self.client.execute(
            operation: "CreateRegistrationAttachment", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Create a new registration attachment to use for uploading a file or a URL to a file. The maximum file size is 500KB and valid file extensions are PDF, JPEG and PNG. For example, many sender ID registrations require a signed “letter of authorization” (LOA) to be submitted. Use either AttachmentUrl or AttachmentBody to upload your attachment. If both are specified then an exception is returned.
    ///
    /// Parameters:
    ///   - attachmentBody: The registration file to upload. The maximum file size is 500KB and valid file extensions are PDF, JPEG and PNG.
    ///   - attachmentUrl: Registration files have to be stored in an Amazon S3 bucket. The URI to use when sending is in the format s3://BucketName/FileName.
    ///   - clientToken: Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you don't specify a client token, a randomly generated token is used for the request to ensure idempotency.
    ///   - tags: An array of tags (key and value pairs) to associate with the registration attachment.
    ///   - logger: Logger use during operation
    @inlinable
    public func createRegistrationAttachment(
        attachmentBody: AWSBase64Data? = nil,
        attachmentUrl: String? = nil,
        clientToken: String? = CreateRegistrationAttachmentRequest.idempotencyToken(),
        tags: [Tag]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateRegistrationAttachmentResult {
        let input = CreateRegistrationAttachmentRequest(
            attachmentBody: attachmentBody, 
            attachmentUrl: attachmentUrl, 
            clientToken: clientToken, 
            tags: tags
        )
        return try await self.createRegistrationAttachment(input, logger: logger)
    }

    /// Create a new version of the registration and increase the VersionNumber. The previous version of the registration becomes read-only.
    @Sendable
    @inlinable
    public func createRegistrationVersion(_ input: CreateRegistrationVersionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateRegistrationVersionResult {
        try await self.client.execute(
            operation: "CreateRegistrationVersion", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Create a new version of the registration and increase the VersionNumber. The previous version of the registration becomes read-only.
    ///
    /// Parameters:
    ///   - registrationId: The unique identifier for the registration.
    ///   - logger: Logger use during operation
    @inlinable
    public func createRegistrationVersion(
        registrationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateRegistrationVersionResult {
        let input = CreateRegistrationVersionRequest(
            registrationId: registrationId
        )
        return try await self.createRegistrationVersion(input, logger: logger)
    }

    /// You can only send messages to verified destination numbers when your account is in the sandbox. You can add up to 10 verified destination numbers.
    @Sendable
    @inlinable
    public func createVerifiedDestinationNumber(_ input: CreateVerifiedDestinationNumberRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateVerifiedDestinationNumberResult {
        try await self.client.execute(
            operation: "CreateVerifiedDestinationNumber", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// You can only send messages to verified destination numbers when your account is in the sandbox. You can add up to 10 verified destination numbers.
    ///
    /// Parameters:
    ///   - clientToken: Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you don't specify a client token, a randomly generated token is used for the request to ensure idempotency.
    ///   - destinationPhoneNumber: The verified destination phone number, in E.164 format.
    ///   - tags: An array of tags (key and value pairs) to associate with the destination number.
    ///   - logger: Logger use during operation
    @inlinable
    public func createVerifiedDestinationNumber(
        clientToken: String? = CreateVerifiedDestinationNumberRequest.idempotencyToken(),
        destinationPhoneNumber: String,
        tags: [Tag]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateVerifiedDestinationNumberResult {
        let input = CreateVerifiedDestinationNumberRequest(
            clientToken: clientToken, 
            destinationPhoneNumber: destinationPhoneNumber, 
            tags: tags
        )
        return try await self.createVerifiedDestinationNumber(input, logger: logger)
    }

    /// Removes the current account default protect configuration.
    @Sendable
    @inlinable
    public func deleteAccountDefaultProtectConfiguration(_ input: DeleteAccountDefaultProtectConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteAccountDefaultProtectConfigurationResult {
        try await self.client.execute(
            operation: "DeleteAccountDefaultProtectConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes the current account default protect configuration.
    ///
    /// Parameters:
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteAccountDefaultProtectConfiguration(
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteAccountDefaultProtectConfigurationResult {
        let input = DeleteAccountDefaultProtectConfigurationRequest(
        )
        return try await self.deleteAccountDefaultProtectConfiguration(input, logger: logger)
    }

    /// Deletes an existing configuration set. A configuration set is a set of rules that you apply to voice and SMS messages that you send. In a configuration set, you can specify a destination for specific types of events related to voice and SMS messages.
    @Sendable
    @inlinable
    public func deleteConfigurationSet(_ input: DeleteConfigurationSetRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteConfigurationSetResult {
        try await self.client.execute(
            operation: "DeleteConfigurationSet", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an existing configuration set. A configuration set is a set of rules that you apply to voice and SMS messages that you send. In a configuration set, you can specify a destination for specific types of events related to voice and SMS messages.
    ///
    /// Parameters:
    ///   - configurationSetName: The name of the configuration set or the configuration set ARN that you want to delete. The ConfigurationSetName and ConfigurationSetArn can be found using the DescribeConfigurationSets action.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteConfigurationSet(
        configurationSetName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteConfigurationSetResult {
        let input = DeleteConfigurationSetRequest(
            configurationSetName: configurationSetName
        )
        return try await self.deleteConfigurationSet(input, logger: logger)
    }

    /// Deletes an existing default message type on a configuration set.  A message type is a type of messages that you plan to send. If you send account-related messages or time-sensitive messages such as one-time passcodes, choose Transactional. If you plan to send messages that contain marketing material or other promotional content, choose Promotional. This setting applies to your entire Amazon Web Services account.
    @Sendable
    @inlinable
    public func deleteDefaultMessageType(_ input: DeleteDefaultMessageTypeRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteDefaultMessageTypeResult {
        try await self.client.execute(
            operation: "DeleteDefaultMessageType", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an existing default message type on a configuration set.  A message type is a type of messages that you plan to send. If you send account-related messages or time-sensitive messages such as one-time passcodes, choose Transactional. If you plan to send messages that contain marketing material or other promotional content, choose Promotional. This setting applies to your entire Amazon Web Services account.
    ///
    /// Parameters:
    ///   - configurationSetName: The name of the configuration set or the configuration set Amazon Resource Name (ARN) to delete the default message type from. The ConfigurationSetName and ConfigurationSetArn can be found using the DescribeConfigurationSets action.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteDefaultMessageType(
        configurationSetName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteDefaultMessageTypeResult {
        let input = DeleteDefaultMessageTypeRequest(
            configurationSetName: configurationSetName
        )
        return try await self.deleteDefaultMessageType(input, logger: logger)
    }

    /// Deletes an existing default sender ID on a configuration set. A default sender ID is the identity that appears on recipients' devices when they receive SMS messages. Support for sender ID capabilities varies by country or region.
    @Sendable
    @inlinable
    public func deleteDefaultSenderId(_ input: DeleteDefaultSenderIdRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteDefaultSenderIdResult {
        try await self.client.execute(
            operation: "DeleteDefaultSenderId", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an existing default sender ID on a configuration set. A default sender ID is the identity that appears on recipients' devices when they receive SMS messages. Support for sender ID capabilities varies by country or region.
    ///
    /// Parameters:
    ///   - configurationSetName: The name of the configuration set or the configuration set Amazon Resource Name (ARN) to delete the default sender ID from. The ConfigurationSetName and ConfigurationSetArn can be found using the DescribeConfigurationSets action.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteDefaultSenderId(
        configurationSetName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteDefaultSenderIdResult {
        let input = DeleteDefaultSenderIdRequest(
            configurationSetName: configurationSetName
        )
        return try await self.deleteDefaultSenderId(input, logger: logger)
    }

    /// Deletes an existing event destination. An event destination is a location where you send response information about the messages that you send. For example, when a message is delivered successfully, you can send information about that event to an Amazon CloudWatch destination, or send notifications to endpoints that are subscribed to an Amazon SNS topic.
    @Sendable
    @inlinable
    public func deleteEventDestination(_ input: DeleteEventDestinationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteEventDestinationResult {
        try await self.client.execute(
            operation: "DeleteEventDestination", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an existing event destination. An event destination is a location where you send response information about the messages that you send. For example, when a message is delivered successfully, you can send information about that event to an Amazon CloudWatch destination, or send notifications to endpoints that are subscribed to an Amazon SNS topic.
    ///
    /// Parameters:
    ///   - configurationSetName: The name of the configuration set or the configuration set's Amazon Resource Name (ARN) to remove the event destination from. The ConfigurateSetName and ConfigurationSetArn can be found using the DescribeConfigurationSets action.
    ///   - eventDestinationName: The name of the event destination to delete.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteEventDestination(
        configurationSetName: String,
        eventDestinationName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteEventDestinationResult {
        let input = DeleteEventDestinationRequest(
            configurationSetName: configurationSetName, 
            eventDestinationName: eventDestinationName
        )
        return try await self.deleteEventDestination(input, logger: logger)
    }

    /// Deletes an existing keyword from an origination phone number or pool. A keyword is a word that you can search for on a particular phone number or pool. It is also a specific word or phrase that an end user can send to your number to elicit a response, such as an informational message or a special offer. When your number receives a message that begins with a keyword, AWS End User Messaging SMS and Voice responds with a customizable message. Keywords "HELP" and "STOP" can't be deleted or modified.
    @Sendable
    @inlinable
    public func deleteKeyword(_ input: DeleteKeywordRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteKeywordResult {
        try await self.client.execute(
            operation: "DeleteKeyword", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an existing keyword from an origination phone number or pool. A keyword is a word that you can search for on a particular phone number or pool. It is also a specific word or phrase that an end user can send to your number to elicit a response, such as an informational message or a special offer. When your number receives a message that begins with a keyword, AWS End User Messaging SMS and Voice responds with a customizable message. Keywords "HELP" and "STOP" can't be deleted or modified.
    ///
    /// Parameters:
    ///   - keyword: The keyword to delete.
    ///   - originationIdentity: The origination identity to use such as a PhoneNumberId, PhoneNumberArn, PoolId or PoolArn. You can use DescribePhoneNumbers to find the values for PhoneNumberId and PhoneNumberArn and DescribePools to find the values of PoolId and PoolArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteKeyword(
        keyword: String,
        originationIdentity: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteKeywordResult {
        let input = DeleteKeywordRequest(
            keyword: keyword, 
            originationIdentity: originationIdentity
        )
        return try await self.deleteKeyword(input, logger: logger)
    }

    /// Deletes an account-level monthly spending limit override for sending multimedia messages (MMS). Deleting a spend limit override will set the EnforcedLimit to equal the MaxLimit, which is controlled by Amazon Web Services. For more information on spend limits (quotas) see Quotas for Server Migration Service in the Server Migration Service User Guide.
    @Sendable
    @inlinable
    public func deleteMediaMessageSpendLimitOverride(_ input: DeleteMediaMessageSpendLimitOverrideRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteMediaMessageSpendLimitOverrideResult {
        try await self.client.execute(
            operation: "DeleteMediaMessageSpendLimitOverride", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an account-level monthly spending limit override for sending multimedia messages (MMS). Deleting a spend limit override will set the EnforcedLimit to equal the MaxLimit, which is controlled by Amazon Web Services. For more information on spend limits (quotas) see Quotas for Server Migration Service in the Server Migration Service User Guide.
    ///
    /// Parameters:
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteMediaMessageSpendLimitOverride(
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteMediaMessageSpendLimitOverrideResult {
        let input = DeleteMediaMessageSpendLimitOverrideRequest(
        )
        return try await self.deleteMediaMessageSpendLimitOverride(input, logger: logger)
    }

    /// Deletes an existing opt-out list. All opted out phone numbers in the opt-out list are deleted. If the specified opt-out list name doesn't exist or is in-use by an origination phone number or pool, an error is returned.
    @Sendable
    @inlinable
    public func deleteOptOutList(_ input: DeleteOptOutListRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteOptOutListResult {
        try await self.client.execute(
            operation: "DeleteOptOutList", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an existing opt-out list. All opted out phone numbers in the opt-out list are deleted. If the specified opt-out list name doesn't exist or is in-use by an origination phone number or pool, an error is returned.
    ///
    /// Parameters:
    ///   - optOutListName: The OptOutListName or OptOutListArn of the OptOutList to delete. You can use DescribeOptOutLists to find the values for OptOutListName and OptOutListArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteOptOutList(
        optOutListName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteOptOutListResult {
        let input = DeleteOptOutListRequest(
            optOutListName: optOutListName
        )
        return try await self.deleteOptOutList(input, logger: logger)
    }

    /// Deletes an existing opted out destination phone number from the specified opt-out list. Each destination phone number can only be deleted once every 30 days. If the specified destination phone number doesn't exist or if the opt-out list doesn't exist, an error is returned.
    @Sendable
    @inlinable
    public func deleteOptedOutNumber(_ input: DeleteOptedOutNumberRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteOptedOutNumberResult {
        try await self.client.execute(
            operation: "DeleteOptedOutNumber", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an existing opted out destination phone number from the specified opt-out list. Each destination phone number can only be deleted once every 30 days. If the specified destination phone number doesn't exist or if the opt-out list doesn't exist, an error is returned.
    ///
    /// Parameters:
    ///   - optedOutNumber: The phone number, in E.164 format, to remove from the OptOutList.
    ///   - optOutListName: The OptOutListName or OptOutListArn to remove the phone number from.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteOptedOutNumber(
        optedOutNumber: String,
        optOutListName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteOptedOutNumberResult {
        let input = DeleteOptedOutNumberRequest(
            optedOutNumber: optedOutNumber, 
            optOutListName: optOutListName
        )
        return try await self.deleteOptedOutNumber(input, logger: logger)
    }

    /// Deletes an existing pool. Deleting a pool disassociates all origination identities from that pool. If the pool status isn't active or if deletion protection is enabled, an error is returned. A pool is a collection of phone numbers and SenderIds. A pool can include one or more phone numbers and SenderIds that are associated with your Amazon Web Services account.
    @Sendable
    @inlinable
    public func deletePool(_ input: DeletePoolRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeletePoolResult {
        try await self.client.execute(
            operation: "DeletePool", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an existing pool. Deleting a pool disassociates all origination identities from that pool. If the pool status isn't active or if deletion protection is enabled, an error is returned. A pool is a collection of phone numbers and SenderIds. A pool can include one or more phone numbers and SenderIds that are associated with your Amazon Web Services account.
    ///
    /// Parameters:
    ///   - poolId: The PoolId or PoolArn of the pool to delete. You can use DescribePools to find the values for PoolId and PoolArn .  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - logger: Logger use during operation
    @inlinable
    public func deletePool(
        poolId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeletePoolResult {
        let input = DeletePoolRequest(
            poolId: poolId
        )
        return try await self.deletePool(input, logger: logger)
    }

    /// Permanently delete the protect configuration. The protect configuration must have deletion protection disabled and must not be associated as the account default protect configuration or associated with a configuration set.
    @Sendable
    @inlinable
    public func deleteProtectConfiguration(_ input: DeleteProtectConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteProtectConfigurationResult {
        try await self.client.execute(
            operation: "DeleteProtectConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Permanently delete the protect configuration. The protect configuration must have deletion protection disabled and must not be associated as the account default protect configuration or associated with a configuration set.
    ///
    /// Parameters:
    ///   - protectConfigurationId: The unique identifier for the protect configuration.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteProtectConfiguration(
        protectConfigurationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteProtectConfigurationResult {
        let input = DeleteProtectConfigurationRequest(
            protectConfigurationId: protectConfigurationId
        )
        return try await self.deleteProtectConfiguration(input, logger: logger)
    }

    /// Permanently delete the protect configuration rule set number override.
    @Sendable
    @inlinable
    public func deleteProtectConfigurationRuleSetNumberOverride(_ input: DeleteProtectConfigurationRuleSetNumberOverrideRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteProtectConfigurationRuleSetNumberOverrideResult {
        try await self.client.execute(
            operation: "DeleteProtectConfigurationRuleSetNumberOverride", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Permanently delete the protect configuration rule set number override.
    ///
    /// Parameters:
    ///   - destinationPhoneNumber: The destination phone number in E.164 format.
    ///   - protectConfigurationId: The unique identifier for the protect configuration.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteProtectConfigurationRuleSetNumberOverride(
        destinationPhoneNumber: String,
        protectConfigurationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteProtectConfigurationRuleSetNumberOverrideResult {
        let input = DeleteProtectConfigurationRuleSetNumberOverrideRequest(
            destinationPhoneNumber: destinationPhoneNumber, 
            protectConfigurationId: protectConfigurationId
        )
        return try await self.deleteProtectConfigurationRuleSetNumberOverride(input, logger: logger)
    }

    /// Permanently delete an existing registration from your account.
    @Sendable
    @inlinable
    public func deleteRegistration(_ input: DeleteRegistrationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteRegistrationResult {
        try await self.client.execute(
            operation: "DeleteRegistration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Permanently delete an existing registration from your account.
    ///
    /// Parameters:
    ///   - registrationId: The unique identifier for the registration.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteRegistration(
        registrationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteRegistrationResult {
        let input = DeleteRegistrationRequest(
            registrationId: registrationId
        )
        return try await self.deleteRegistration(input, logger: logger)
    }

    /// Permanently delete the specified registration attachment.
    @Sendable
    @inlinable
    public func deleteRegistrationAttachment(_ input: DeleteRegistrationAttachmentRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteRegistrationAttachmentResult {
        try await self.client.execute(
            operation: "DeleteRegistrationAttachment", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Permanently delete the specified registration attachment.
    ///
    /// Parameters:
    ///   - registrationAttachmentId: The unique identifier for the registration attachment.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteRegistrationAttachment(
        registrationAttachmentId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteRegistrationAttachmentResult {
        let input = DeleteRegistrationAttachmentRequest(
            registrationAttachmentId: registrationAttachmentId
        )
        return try await self.deleteRegistrationAttachment(input, logger: logger)
    }

    /// Delete the value in a registration form field.
    @Sendable
    @inlinable
    public func deleteRegistrationFieldValue(_ input: DeleteRegistrationFieldValueRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteRegistrationFieldValueResult {
        try await self.client.execute(
            operation: "DeleteRegistrationFieldValue", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Delete the value in a registration form field.
    ///
    /// Parameters:
    ///   - fieldPath: The path to the registration form field. You can use DescribeRegistrationFieldDefinitions for a list of FieldPaths.
    ///   - registrationId: The unique identifier for the registration.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteRegistrationFieldValue(
        fieldPath: String,
        registrationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteRegistrationFieldValueResult {
        let input = DeleteRegistrationFieldValueRequest(
            fieldPath: fieldPath, 
            registrationId: registrationId
        )
        return try await self.deleteRegistrationFieldValue(input, logger: logger)
    }

    /// Deletes the resource-based policy document attached to the AWS End User Messaging SMS and Voice resource. A shared resource can be a Pool, Opt-out list, Sender Id, or Phone number.
    @Sendable
    @inlinable
    public func deleteResourcePolicy(_ input: DeleteResourcePolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteResourcePolicyResult {
        try await self.client.execute(
            operation: "DeleteResourcePolicy", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes the resource-based policy document attached to the AWS End User Messaging SMS and Voice resource. A shared resource can be a Pool, Opt-out list, Sender Id, or Phone number.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the AWS End User Messaging SMS and Voice resource you're deleting the resource-based policy from.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteResourcePolicy(
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteResourcePolicyResult {
        let input = DeleteResourcePolicyRequest(
            resourceArn: resourceArn
        )
        return try await self.deleteResourcePolicy(input, logger: logger)
    }

    /// Deletes an account-level monthly spending limit override for sending text messages. Deleting a spend limit override will set the EnforcedLimit to equal the MaxLimit, which is controlled by Amazon Web Services. For more information on spend limits (quotas) see Quotas  in the AWS End User Messaging SMS User Guide.
    @Sendable
    @inlinable
    public func deleteTextMessageSpendLimitOverride(_ input: DeleteTextMessageSpendLimitOverrideRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteTextMessageSpendLimitOverrideResult {
        try await self.client.execute(
            operation: "DeleteTextMessageSpendLimitOverride", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an account-level monthly spending limit override for sending text messages. Deleting a spend limit override will set the EnforcedLimit to equal the MaxLimit, which is controlled by Amazon Web Services. For more information on spend limits (quotas) see Quotas  in the AWS End User Messaging SMS User Guide.
    ///
    /// Parameters:
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteTextMessageSpendLimitOverride(
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteTextMessageSpendLimitOverrideResult {
        let input = DeleteTextMessageSpendLimitOverrideRequest(
        )
        return try await self.deleteTextMessageSpendLimitOverride(input, logger: logger)
    }

    /// Delete a verified destination phone number.
    @Sendable
    @inlinable
    public func deleteVerifiedDestinationNumber(_ input: DeleteVerifiedDestinationNumberRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteVerifiedDestinationNumberResult {
        try await self.client.execute(
            operation: "DeleteVerifiedDestinationNumber", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Delete a verified destination phone number.
    ///
    /// Parameters:
    ///   - verifiedDestinationNumberId: The unique identifier for the verified destination phone number.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteVerifiedDestinationNumber(
        verifiedDestinationNumberId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteVerifiedDestinationNumberResult {
        let input = DeleteVerifiedDestinationNumberRequest(
            verifiedDestinationNumberId: verifiedDestinationNumberId
        )
        return try await self.deleteVerifiedDestinationNumber(input, logger: logger)
    }

    /// Deletes an account level monthly spend limit override for sending voice messages. Deleting a spend limit override sets the EnforcedLimit equal to the MaxLimit, which is controlled by Amazon Web Services. For more information on spending limits (quotas) see Quotas  in the AWS End User Messaging SMS User Guide.
    @Sendable
    @inlinable
    public func deleteVoiceMessageSpendLimitOverride(_ input: DeleteVoiceMessageSpendLimitOverrideRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteVoiceMessageSpendLimitOverrideResult {
        try await self.client.execute(
            operation: "DeleteVoiceMessageSpendLimitOverride", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an account level monthly spend limit override for sending voice messages. Deleting a spend limit override sets the EnforcedLimit equal to the MaxLimit, which is controlled by Amazon Web Services. For more information on spending limits (quotas) see Quotas  in the AWS End User Messaging SMS User Guide.
    ///
    /// Parameters:
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteVoiceMessageSpendLimitOverride(
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteVoiceMessageSpendLimitOverrideResult {
        let input = DeleteVoiceMessageSpendLimitOverrideRequest(
        )
        return try await self.deleteVoiceMessageSpendLimitOverride(input, logger: logger)
    }

    /// Describes attributes of your Amazon Web Services account. The supported account attributes include account tier, which indicates whether your account is in the sandbox or production environment. When you're ready to move your account out of the sandbox, create an Amazon Web Services Support case for a service limit increase request. New accounts are placed into an SMS or voice sandbox. The sandbox protects both Amazon Web Services end recipients and SMS or voice recipients from fraud and abuse.
    @Sendable
    @inlinable
    public func describeAccountAttributes(_ input: DescribeAccountAttributesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeAccountAttributesResult {
        try await self.client.execute(
            operation: "DescribeAccountAttributes", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Describes attributes of your Amazon Web Services account. The supported account attributes include account tier, which indicates whether your account is in the sandbox or production environment. When you're ready to move your account out of the sandbox, create an Amazon Web Services Support case for a service limit increase request. New accounts are placed into an SMS or voice sandbox. The sandbox protects both Amazon Web Services end recipients and SMS or voice recipients from fraud and abuse.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeAccountAttributes(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeAccountAttributesResult {
        let input = DescribeAccountAttributesRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.describeAccountAttributes(input, logger: logger)
    }

    /// Describes the current AWS End User Messaging SMS and Voice SMS Voice V2 resource quotas for your account. The description for a quota includes the quota name, current usage toward that quota, and the quota's maximum value. When you establish an Amazon Web Services account, the account has initial quotas on the maximum number of configuration sets, opt-out lists, phone numbers, and pools that you can create in a given Region. For more information see Quotas  in the AWS End User Messaging SMS User Guide.
    @Sendable
    @inlinable
    public func describeAccountLimits(_ input: DescribeAccountLimitsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeAccountLimitsResult {
        try await self.client.execute(
            operation: "DescribeAccountLimits", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Describes the current AWS End User Messaging SMS and Voice SMS Voice V2 resource quotas for your account. The description for a quota includes the quota name, current usage toward that quota, and the quota's maximum value. When you establish an Amazon Web Services account, the account has initial quotas on the maximum number of configuration sets, opt-out lists, phone numbers, and pools that you can create in a given Region. For more information see Quotas  in the AWS End User Messaging SMS User Guide.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeAccountLimits(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeAccountLimitsResult {
        let input = DescribeAccountLimitsRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.describeAccountLimits(input, logger: logger)
    }

    /// Describes the specified configuration sets or all in your account. If you specify configuration set names, the output includes information for only the specified configuration sets. If you specify filters, the output includes information for only those configuration sets that meet the filter criteria. If you don't specify configuration set names or filters, the output includes information for all configuration sets. If you specify a configuration set name that isn't valid, an error is returned.
    @Sendable
    @inlinable
    public func describeConfigurationSets(_ input: DescribeConfigurationSetsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeConfigurationSetsResult {
        try await self.client.execute(
            operation: "DescribeConfigurationSets", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Describes the specified configuration sets or all in your account. If you specify configuration set names, the output includes information for only the specified configuration sets. If you specify filters, the output includes information for only those configuration sets that meet the filter criteria. If you don't specify configuration set names or filters, the output includes information for all configuration sets. If you specify a configuration set name that isn't valid, an error is returned.
    ///
    /// Parameters:
    ///   - configurationSetNames: An array of strings. Each element can be either a ConfigurationSetName or ConfigurationSetArn.
    ///   - filters: An array of filters to apply to the results that are returned.
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeConfigurationSets(
        configurationSetNames: [String]? = nil,
        filters: [ConfigurationSetFilter]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeConfigurationSetsResult {
        let input = DescribeConfigurationSetsRequest(
            configurationSetNames: configurationSetNames, 
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.describeConfigurationSets(input, logger: logger)
    }

    /// Describes the specified keywords or all keywords on your origination phone number or pool. A keyword is a word that you can search for on a particular phone number or pool. It is also a specific word or phrase that an end user can send to your number to elicit a response, such as an informational message or a special offer. When your number receives a message that begins with a keyword, AWS End User Messaging SMS and Voice responds with a customizable message. If you specify a keyword that isn't valid, an error is returned.
    @Sendable
    @inlinable
    public func describeKeywords(_ input: DescribeKeywordsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeKeywordsResult {
        try await self.client.execute(
            operation: "DescribeKeywords", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Describes the specified keywords or all keywords on your origination phone number or pool. A keyword is a word that you can search for on a particular phone number or pool. It is also a specific word or phrase that an end user can send to your number to elicit a response, such as an informational message or a special offer. When your number receives a message that begins with a keyword, AWS End User Messaging SMS and Voice responds with a customizable message. If you specify a keyword that isn't valid, an error is returned.
    ///
    /// Parameters:
    ///   - filters: An array of keyword filters to filter the results.
    ///   - keywords: An array of keywords to search for.
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - originationIdentity: The origination identity to use such as a PhoneNumberId, PhoneNumberArn, SenderId or SenderIdArn. You can use DescribePhoneNumbers to find the values for PhoneNumberId and PhoneNumberArn while DescribeSenderIds can be used to get the values for SenderId and SenderIdArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - logger: Logger use during operation
    @inlinable
    public func describeKeywords(
        filters: [KeywordFilter]? = nil,
        keywords: [String]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        originationIdentity: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeKeywordsResult {
        let input = DescribeKeywordsRequest(
            filters: filters, 
            keywords: keywords, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            originationIdentity: originationIdentity
        )
        return try await self.describeKeywords(input, logger: logger)
    }

    /// Describes the specified opt-out list or all opt-out lists in your account. If you specify opt-out list names, the output includes information for only the specified opt-out lists. Opt-out lists include only those that meet the filter criteria. If you don't specify opt-out list names or filters, the output includes information for all opt-out lists. If you specify an opt-out list name that isn't valid, an error is returned.
    @Sendable
    @inlinable
    public func describeOptOutLists(_ input: DescribeOptOutListsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeOptOutListsResult {
        try await self.client.execute(
            operation: "DescribeOptOutLists", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Describes the specified opt-out list or all opt-out lists in your account. If you specify opt-out list names, the output includes information for only the specified opt-out lists. Opt-out lists include only those that meet the filter criteria. If you don't specify opt-out list names or filters, the output includes information for all opt-out lists. If you specify an opt-out list name that isn't valid, an error is returned.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - optOutListNames: The OptOutLists to show the details of. This is an array of strings that can be either the OptOutListName or OptOutListArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - owner: Use SELF to filter the list of Opt-Out List to ones your account owns or use SHARED to filter on Opt-Out List shared with your account. The Owner and OptOutListNames parameters can't be used at the same time.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeOptOutLists(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        optOutListNames: [String]? = nil,
        owner: Owner? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeOptOutListsResult {
        let input = DescribeOptOutListsRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            optOutListNames: optOutListNames, 
            owner: owner
        )
        return try await self.describeOptOutLists(input, logger: logger)
    }

    /// Describes the specified opted out destination numbers or all opted out destination numbers in an opt-out list. If you specify opted out numbers, the output includes information for only the specified opted out numbers. If you specify filters, the output includes information for only those opted out numbers that meet the filter criteria. If you don't specify opted out numbers or filters, the output includes information for all opted out destination numbers in your opt-out list. If you specify an opted out number that isn't valid, an exception is returned.
    @Sendable
    @inlinable
    public func describeOptedOutNumbers(_ input: DescribeOptedOutNumbersRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeOptedOutNumbersResult {
        try await self.client.execute(
            operation: "DescribeOptedOutNumbers", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Describes the specified opted out destination numbers or all opted out destination numbers in an opt-out list. If you specify opted out numbers, the output includes information for only the specified opted out numbers. If you specify filters, the output includes information for only those opted out numbers that meet the filter criteria. If you don't specify opted out numbers or filters, the output includes information for all opted out destination numbers in your opt-out list. If you specify an opted out number that isn't valid, an exception is returned.
    ///
    /// Parameters:
    ///   - filters: An array of OptedOutFilter objects to filter the results on.
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - optedOutNumbers: An array of phone numbers to search for in the OptOutList. If you specify an opted out number that isn't valid, an exception is returned.
    ///   - optOutListName: The OptOutListName or OptOutListArn of the OptOutList. You can use DescribeOptOutLists to find the values for OptOutListName and OptOutListArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - logger: Logger use during operation
    @inlinable
    public func describeOptedOutNumbers(
        filters: [OptedOutFilter]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        optedOutNumbers: [String]? = nil,
        optOutListName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeOptedOutNumbersResult {
        let input = DescribeOptedOutNumbersRequest(
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            optedOutNumbers: optedOutNumbers, 
            optOutListName: optOutListName
        )
        return try await self.describeOptedOutNumbers(input, logger: logger)
    }

    /// Describes the specified origination phone number, or all the phone numbers in your account. If you specify phone number IDs, the output includes information for only the specified phone numbers. If you specify filters, the output includes information for only those phone numbers that meet the filter criteria. If you don't specify phone number IDs or filters, the output includes information for all phone numbers. If you specify a phone number ID that isn't valid, an error is returned.
    @Sendable
    @inlinable
    public func describePhoneNumbers(_ input: DescribePhoneNumbersRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribePhoneNumbersResult {
        try await self.client.execute(
            operation: "DescribePhoneNumbers", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Describes the specified origination phone number, or all the phone numbers in your account. If you specify phone number IDs, the output includes information for only the specified phone numbers. If you specify filters, the output includes information for only those phone numbers that meet the filter criteria. If you don't specify phone number IDs or filters, the output includes information for all phone numbers. If you specify a phone number ID that isn't valid, an error is returned.
    ///
    /// Parameters:
    ///   - filters: An array of PhoneNumberFilter objects to filter the results.
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - owner: Use SELF to filter the list of phone numbers to ones your account owns or use SHARED to filter on phone numbers shared with your account. The Owner and PhoneNumberIds parameters can't be used at the same time.
    ///   - phoneNumberIds: The unique identifier of phone numbers to find information about. This is an array of strings that can be either the PhoneNumberId or PhoneNumberArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - logger: Logger use during operation
    @inlinable
    public func describePhoneNumbers(
        filters: [PhoneNumberFilter]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        owner: Owner? = nil,
        phoneNumberIds: [String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribePhoneNumbersResult {
        let input = DescribePhoneNumbersRequest(
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            owner: owner, 
            phoneNumberIds: phoneNumberIds
        )
        return try await self.describePhoneNumbers(input, logger: logger)
    }

    /// Retrieves the specified pools or all pools associated with your Amazon Web Services account. If you specify pool IDs, the output includes information for only the specified pools. If you specify filters, the output includes information for only those pools that meet the filter criteria. If you don't specify pool IDs or filters, the output includes information for all pools. If you specify a pool ID that isn't valid, an error is returned. A pool is a collection of phone numbers and SenderIds. A pool can include one or more phone numbers and SenderIds that are associated with your Amazon Web Services account.
    @Sendable
    @inlinable
    public func describePools(_ input: DescribePoolsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribePoolsResult {
        try await self.client.execute(
            operation: "DescribePools", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the specified pools or all pools associated with your Amazon Web Services account. If you specify pool IDs, the output includes information for only the specified pools. If you specify filters, the output includes information for only those pools that meet the filter criteria. If you don't specify pool IDs or filters, the output includes information for all pools. If you specify a pool ID that isn't valid, an error is returned. A pool is a collection of phone numbers and SenderIds. A pool can include one or more phone numbers and SenderIds that are associated with your Amazon Web Services account.
    ///
    /// Parameters:
    ///   - filters: An array of PoolFilter objects to filter the results.
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - owner: Use SELF to filter the list of Pools to ones your account owns or use SHARED to filter on Pools shared with your account. The Owner and PoolIds parameters can't be used at the same time.
    ///   - poolIds: The unique identifier of pools to find. This is an array of strings that can be either the PoolId or PoolArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - logger: Logger use during operation
    @inlinable
    public func describePools(
        filters: [PoolFilter]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        owner: Owner? = nil,
        poolIds: [String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribePoolsResult {
        let input = DescribePoolsRequest(
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            owner: owner, 
            poolIds: poolIds
        )
        return try await self.describePools(input, logger: logger)
    }

    /// Retrieves the protect configurations that match any of filters. If a filter isn’t provided then all protect configurations are returned.
    @Sendable
    @inlinable
    public func describeProtectConfigurations(_ input: DescribeProtectConfigurationsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeProtectConfigurationsResult {
        try await self.client.execute(
            operation: "DescribeProtectConfigurations", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the protect configurations that match any of filters. If a filter isn’t provided then all protect configurations are returned.
    ///
    /// Parameters:
    ///   - filters: An array of ProtectConfigurationFilter objects to filter the results.
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - protectConfigurationIds: An array of protect configuration identifiers to search for.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeProtectConfigurations(
        filters: [ProtectConfigurationFilter]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        protectConfigurationIds: [String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeProtectConfigurationsResult {
        let input = DescribeProtectConfigurationsRequest(
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            protectConfigurationIds: protectConfigurationIds
        )
        return try await self.describeProtectConfigurations(input, logger: logger)
    }

    /// Retrieves the specified registration attachments or all registration attachments associated with your Amazon Web Services account.
    @Sendable
    @inlinable
    public func describeRegistrationAttachments(_ input: DescribeRegistrationAttachmentsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeRegistrationAttachmentsResult {
        try await self.client.execute(
            operation: "DescribeRegistrationAttachments", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the specified registration attachments or all registration attachments associated with your Amazon Web Services account.
    ///
    /// Parameters:
    ///   - filters: An array of RegistrationAttachmentFilter objects to filter the results.
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - registrationAttachmentIds: The unique identifier of registration attachments to find. This is an array of RegistrationAttachmentId.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeRegistrationAttachments(
        filters: [RegistrationAttachmentFilter]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        registrationAttachmentIds: [String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeRegistrationAttachmentsResult {
        let input = DescribeRegistrationAttachmentsRequest(
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            registrationAttachmentIds: registrationAttachmentIds
        )
        return try await self.describeRegistrationAttachments(input, logger: logger)
    }

    /// Retrieves the specified registration type field definitions. You can use DescribeRegistrationFieldDefinitions to view the requirements for creating, filling out, and submitting each registration type.
    @Sendable
    @inlinable
    public func describeRegistrationFieldDefinitions(_ input: DescribeRegistrationFieldDefinitionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeRegistrationFieldDefinitionsResult {
        try await self.client.execute(
            operation: "DescribeRegistrationFieldDefinitions", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the specified registration type field definitions. You can use DescribeRegistrationFieldDefinitions to view the requirements for creating, filling out, and submitting each registration type.
    ///
    /// Parameters:
    ///   - fieldPaths: An array of paths to the registration form field.
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - registrationType: The type of registration form. The list of RegistrationTypes can be found using the DescribeRegistrationTypeDefinitions action.
    ///   - sectionPath: The path to the section of the registration.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeRegistrationFieldDefinitions(
        fieldPaths: [String]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        registrationType: String,
        sectionPath: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeRegistrationFieldDefinitionsResult {
        let input = DescribeRegistrationFieldDefinitionsRequest(
            fieldPaths: fieldPaths, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            registrationType: registrationType, 
            sectionPath: sectionPath
        )
        return try await self.describeRegistrationFieldDefinitions(input, logger: logger)
    }

    /// Retrieves the specified registration field values.
    @Sendable
    @inlinable
    public func describeRegistrationFieldValues(_ input: DescribeRegistrationFieldValuesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeRegistrationFieldValuesResult {
        try await self.client.execute(
            operation: "DescribeRegistrationFieldValues", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the specified registration field values.
    ///
    /// Parameters:
    ///   - fieldPaths: An array of paths to the registration form field.
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - registrationId: The unique identifier for the registration.
    ///   - sectionPath: The path to the section of the registration.
    ///   - versionNumber: The version number of the registration.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeRegistrationFieldValues(
        fieldPaths: [String]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        registrationId: String,
        sectionPath: String? = nil,
        versionNumber: Int64? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeRegistrationFieldValuesResult {
        let input = DescribeRegistrationFieldValuesRequest(
            fieldPaths: fieldPaths, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            registrationId: registrationId, 
            sectionPath: sectionPath, 
            versionNumber: versionNumber
        )
        return try await self.describeRegistrationFieldValues(input, logger: logger)
    }

    /// Retrieves the specified registration section definitions. You can use DescribeRegistrationSectionDefinitions to view the requirements for creating, filling out, and submitting each registration type.
    @Sendable
    @inlinable
    public func describeRegistrationSectionDefinitions(_ input: DescribeRegistrationSectionDefinitionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeRegistrationSectionDefinitionsResult {
        try await self.client.execute(
            operation: "DescribeRegistrationSectionDefinitions", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the specified registration section definitions. You can use DescribeRegistrationSectionDefinitions to view the requirements for creating, filling out, and submitting each registration type.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - registrationType: The type of registration form. The list of RegistrationTypes can be found using the DescribeRegistrationTypeDefinitions action.
    ///   - sectionPaths: An array of paths for the registration form section.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeRegistrationSectionDefinitions(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        registrationType: String,
        sectionPaths: [String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeRegistrationSectionDefinitionsResult {
        let input = DescribeRegistrationSectionDefinitionsRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            registrationType: registrationType, 
            sectionPaths: sectionPaths
        )
        return try await self.describeRegistrationSectionDefinitions(input, logger: logger)
    }

    /// Retrieves the specified registration type definitions. You can use DescribeRegistrationTypeDefinitions to view the requirements for creating, filling out, and submitting each registration type.
    @Sendable
    @inlinable
    public func describeRegistrationTypeDefinitions(_ input: DescribeRegistrationTypeDefinitionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeRegistrationTypeDefinitionsResult {
        try await self.client.execute(
            operation: "DescribeRegistrationTypeDefinitions", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the specified registration type definitions. You can use DescribeRegistrationTypeDefinitions to view the requirements for creating, filling out, and submitting each registration type.
    ///
    /// Parameters:
    ///   - filters: An array of RegistrationFilter objects to filter the results.
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - registrationTypes: The type of registration form. The list of RegistrationTypes can be found using the DescribeRegistrationTypeDefinitions action.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeRegistrationTypeDefinitions(
        filters: [RegistrationTypeFilter]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        registrationTypes: [String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeRegistrationTypeDefinitionsResult {
        let input = DescribeRegistrationTypeDefinitionsRequest(
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            registrationTypes: registrationTypes
        )
        return try await self.describeRegistrationTypeDefinitions(input, logger: logger)
    }

    /// Retrieves the specified registration version.
    @Sendable
    @inlinable
    public func describeRegistrationVersions(_ input: DescribeRegistrationVersionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeRegistrationVersionsResult {
        try await self.client.execute(
            operation: "DescribeRegistrationVersions", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the specified registration version.
    ///
    /// Parameters:
    ///   - filters: An array of RegistrationVersionFilter objects to filter the results.
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - registrationId: The unique identifier for the registration.
    ///   - versionNumbers: An array of registration version numbers.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeRegistrationVersions(
        filters: [RegistrationVersionFilter]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        registrationId: String,
        versionNumbers: [Int64]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeRegistrationVersionsResult {
        let input = DescribeRegistrationVersionsRequest(
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            registrationId: registrationId, 
            versionNumbers: versionNumbers
        )
        return try await self.describeRegistrationVersions(input, logger: logger)
    }

    /// Retrieves the specified registrations.
    @Sendable
    @inlinable
    public func describeRegistrations(_ input: DescribeRegistrationsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeRegistrationsResult {
        try await self.client.execute(
            operation: "DescribeRegistrations", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the specified registrations.
    ///
    /// Parameters:
    ///   - filters: An array of RegistrationFilter objects to filter the results.
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - registrationIds: An array of unique identifiers for each registration.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeRegistrations(
        filters: [RegistrationFilter]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        registrationIds: [String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeRegistrationsResult {
        let input = DescribeRegistrationsRequest(
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            registrationIds: registrationIds
        )
        return try await self.describeRegistrations(input, logger: logger)
    }

    /// Describes the specified SenderIds or all SenderIds associated with your Amazon Web Services account. If you specify SenderIds, the output includes information for only the specified SenderIds. If you specify filters, the output includes information for only those SenderIds that meet the filter criteria. If you don't specify SenderIds or filters, the output includes information for all SenderIds. f you specify a sender ID that isn't valid, an error is returned.
    @Sendable
    @inlinable
    public func describeSenderIds(_ input: DescribeSenderIdsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeSenderIdsResult {
        try await self.client.execute(
            operation: "DescribeSenderIds", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Describes the specified SenderIds or all SenderIds associated with your Amazon Web Services account. If you specify SenderIds, the output includes information for only the specified SenderIds. If you specify filters, the output includes information for only those SenderIds that meet the filter criteria. If you don't specify SenderIds or filters, the output includes information for all SenderIds. f you specify a sender ID that isn't valid, an error is returned.
    ///
    /// Parameters:
    ///   - filters: An array of SenderIdFilter objects to filter the results.
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - owner: Use SELF to filter the list of Sender Ids to ones your account owns or use SHARED to filter on Sender Ids shared with your account. The Owner and SenderIds parameters can't be used at the same time.
    ///   - senderIds: An array of SenderIdAndCountry objects to search for.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - logger: Logger use during operation
    @inlinable
    public func describeSenderIds(
        filters: [SenderIdFilter]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        owner: Owner? = nil,
        senderIds: [SenderIdAndCountry]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeSenderIdsResult {
        let input = DescribeSenderIdsRequest(
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            owner: owner, 
            senderIds: senderIds
        )
        return try await self.describeSenderIds(input, logger: logger)
    }

    /// Describes the current monthly spend limits for sending voice and text messages. When you establish an Amazon Web Services account, the account has initial monthly spend limit in a given Region. For more information on increasing your monthly spend limit, see  Requesting increases to your monthly SMS, MMS, or Voice spending quota  in the AWS End User Messaging SMS User Guide.
    @Sendable
    @inlinable
    public func describeSpendLimits(_ input: DescribeSpendLimitsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeSpendLimitsResult {
        try await self.client.execute(
            operation: "DescribeSpendLimits", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Describes the current monthly spend limits for sending voice and text messages. When you establish an Amazon Web Services account, the account has initial monthly spend limit in a given Region. For more information on increasing your monthly spend limit, see  Requesting increases to your monthly SMS, MMS, or Voice spending quota  in the AWS End User Messaging SMS User Guide.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeSpendLimits(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeSpendLimitsResult {
        let input = DescribeSpendLimitsRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.describeSpendLimits(input, logger: logger)
    }

    /// Retrieves the specified verified destination numbers.
    @Sendable
    @inlinable
    public func describeVerifiedDestinationNumbers(_ input: DescribeVerifiedDestinationNumbersRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeVerifiedDestinationNumbersResult {
        try await self.client.execute(
            operation: "DescribeVerifiedDestinationNumbers", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the specified verified destination numbers.
    ///
    /// Parameters:
    ///   - destinationPhoneNumbers: An array of verified destination phone number, in E.164 format.
    ///   - filters: An array of VerifiedDestinationNumberFilter objects to filter the results.
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - verifiedDestinationNumberIds: An array of VerifiedDestinationNumberid to retrieve.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeVerifiedDestinationNumbers(
        destinationPhoneNumbers: [String]? = nil,
        filters: [VerifiedDestinationNumberFilter]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        verifiedDestinationNumberIds: [String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeVerifiedDestinationNumbersResult {
        let input = DescribeVerifiedDestinationNumbersRequest(
            destinationPhoneNumbers: destinationPhoneNumbers, 
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            verifiedDestinationNumberIds: verifiedDestinationNumberIds
        )
        return try await self.describeVerifiedDestinationNumbers(input, logger: logger)
    }

    /// Removes the specified origination identity from an existing pool. If the origination identity isn't associated with the specified pool, an error is returned.
    @Sendable
    @inlinable
    public func disassociateOriginationIdentity(_ input: DisassociateOriginationIdentityRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DisassociateOriginationIdentityResult {
        try await self.client.execute(
            operation: "DisassociateOriginationIdentity", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes the specified origination identity from an existing pool. If the origination identity isn't associated with the specified pool, an error is returned.
    ///
    /// Parameters:
    ///   - clientToken: Unique, case-sensitive identifier you provide to ensure the idempotency of the request. If you don't specify a client token, a randomly generated token is used for the request to ensure idempotency.
    ///   - isoCountryCode: The two-character code, in ISO 3166-1 alpha-2 format, for the country or region.
    ///   - originationIdentity: The origination identity to use such as a PhoneNumberId, PhoneNumberArn, SenderId or SenderIdArn. You can use DescribePhoneNumbers find the values for PhoneNumberId and PhoneNumberArn, or use DescribeSenderIds to get the values for SenderId and SenderIdArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - poolId: The unique identifier for the pool to disassociate with the origination identity. This value can be either the PoolId or PoolArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - logger: Logger use during operation
    @inlinable
    public func disassociateOriginationIdentity(
        clientToken: String? = DisassociateOriginationIdentityRequest.idempotencyToken(),
        isoCountryCode: String,
        originationIdentity: String,
        poolId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DisassociateOriginationIdentityResult {
        let input = DisassociateOriginationIdentityRequest(
            clientToken: clientToken, 
            isoCountryCode: isoCountryCode, 
            originationIdentity: originationIdentity, 
            poolId: poolId
        )
        return try await self.disassociateOriginationIdentity(input, logger: logger)
    }

    /// Disassociate a protect configuration from a configuration set.
    @Sendable
    @inlinable
    public func disassociateProtectConfiguration(_ input: DisassociateProtectConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DisassociateProtectConfigurationResult {
        try await self.client.execute(
            operation: "DisassociateProtectConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Disassociate a protect configuration from a configuration set.
    ///
    /// Parameters:
    ///   - configurationSetName: The name of the ConfigurationSet.
    ///   - protectConfigurationId: The unique identifier for the protect configuration.
    ///   - logger: Logger use during operation
    @inlinable
    public func disassociateProtectConfiguration(
        configurationSetName: String,
        protectConfigurationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DisassociateProtectConfigurationResult {
        let input = DisassociateProtectConfigurationRequest(
            configurationSetName: configurationSetName, 
            protectConfigurationId: protectConfigurationId
        )
        return try await self.disassociateProtectConfiguration(input, logger: logger)
    }

    /// Discard the current version of the registration.
    @Sendable
    @inlinable
    public func discardRegistrationVersion(_ input: DiscardRegistrationVersionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DiscardRegistrationVersionResult {
        try await self.client.execute(
            operation: "DiscardRegistrationVersion", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Discard the current version of the registration.
    ///
    /// Parameters:
    ///   - registrationId: The unique identifier for the registration.
    ///   - logger: Logger use during operation
    @inlinable
    public func discardRegistrationVersion(
        registrationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DiscardRegistrationVersionResult {
        let input = DiscardRegistrationVersionRequest(
            registrationId: registrationId
        )
        return try await self.discardRegistrationVersion(input, logger: logger)
    }

    /// Retrieve the CountryRuleSet for the specified NumberCapability from a protect configuration.
    @Sendable
    @inlinable
    public func getProtectConfigurationCountryRuleSet(_ input: GetProtectConfigurationCountryRuleSetRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetProtectConfigurationCountryRuleSetResult {
        try await self.client.execute(
            operation: "GetProtectConfigurationCountryRuleSet", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieve the CountryRuleSet for the specified NumberCapability from a protect configuration.
    ///
    /// Parameters:
    ///   - numberCapability: The capability type to return the CountryRuleSet for. Valid values are SMS, VOICE, or MMS.
    ///   - protectConfigurationId: The unique identifier for the protect configuration.
    ///   - logger: Logger use during operation
    @inlinable
    public func getProtectConfigurationCountryRuleSet(
        numberCapability: NumberCapability,
        protectConfigurationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetProtectConfigurationCountryRuleSetResult {
        let input = GetProtectConfigurationCountryRuleSetRequest(
            numberCapability: numberCapability, 
            protectConfigurationId: protectConfigurationId
        )
        return try await self.getProtectConfigurationCountryRuleSet(input, logger: logger)
    }

    /// Retrieves the JSON text of the resource-based policy document attached to the AWS End User Messaging SMS and Voice resource. A shared resource can be a Pool, Opt-out list, Sender Id, or Phone number.
    @Sendable
    @inlinable
    public func getResourcePolicy(_ input: GetResourcePolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetResourcePolicyResult {
        try await self.client.execute(
            operation: "GetResourcePolicy", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieves the JSON text of the resource-based policy document attached to the AWS End User Messaging SMS and Voice resource. A shared resource can be a Pool, Opt-out list, Sender Id, or Phone number.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the AWS End User Messaging SMS and Voice resource attached to the resource-based policy.
    ///   - logger: Logger use during operation
    @inlinable
    public func getResourcePolicy(
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetResourcePolicyResult {
        let input = GetResourcePolicyRequest(
            resourceArn: resourceArn
        )
        return try await self.getResourcePolicy(input, logger: logger)
    }

    /// Lists all associated origination identities in your pool. If you specify filters, the output includes information for only those origination identities that meet the filter criteria.
    @Sendable
    @inlinable
    public func listPoolOriginationIdentities(_ input: ListPoolOriginationIdentitiesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListPoolOriginationIdentitiesResult {
        try await self.client.execute(
            operation: "ListPoolOriginationIdentities", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists all associated origination identities in your pool. If you specify filters, the output includes information for only those origination identities that meet the filter criteria.
    ///
    /// Parameters:
    ///   - filters: An array of PoolOriginationIdentitiesFilter objects to filter the results..
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - poolId: The unique identifier for the pool. This value can be either the PoolId or PoolArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - logger: Logger use during operation
    @inlinable
    public func listPoolOriginationIdentities(
        filters: [PoolOriginationIdentitiesFilter]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        poolId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListPoolOriginationIdentitiesResult {
        let input = ListPoolOriginationIdentitiesRequest(
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            poolId: poolId
        )
        return try await self.listPoolOriginationIdentities(input, logger: logger)
    }

    /// Retrieve all of the protect configuration rule set number overrides that match the filters.
    @Sendable
    @inlinable
    public func listProtectConfigurationRuleSetNumberOverrides(_ input: ListProtectConfigurationRuleSetNumberOverridesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListProtectConfigurationRuleSetNumberOverridesResult {
        try await self.client.execute(
            operation: "ListProtectConfigurationRuleSetNumberOverrides", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieve all of the protect configuration rule set number overrides that match the filters.
    ///
    /// Parameters:
    ///   - filters: An array of ProtectConfigurationRuleSetNumberOverrideFilterItem objects to filter the results.
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - protectConfigurationId: The unique identifier for the protect configuration.
    ///   - logger: Logger use during operation
    @inlinable
    public func listProtectConfigurationRuleSetNumberOverrides(
        filters: [ProtectConfigurationRuleSetNumberOverrideFilterItem]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        protectConfigurationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListProtectConfigurationRuleSetNumberOverridesResult {
        let input = ListProtectConfigurationRuleSetNumberOverridesRequest(
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            protectConfigurationId: protectConfigurationId
        )
        return try await self.listProtectConfigurationRuleSetNumberOverrides(input, logger: logger)
    }

    /// Retrieve all of the origination identities that are associated with a registration.
    @Sendable
    @inlinable
    public func listRegistrationAssociations(_ input: ListRegistrationAssociationsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListRegistrationAssociationsResult {
        try await self.client.execute(
            operation: "ListRegistrationAssociations", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Retrieve all of the origination identities that are associated with a registration.
    ///
    /// Parameters:
    ///   - filters: An array of RegistrationAssociationFilter to apply to the results that are returned.
    ///   - maxResults: The maximum number of results to return per each request.
    ///   - nextToken: The token to be used for the next set of paginated results. You don't need to supply a value for this field in the initial request.
    ///   - registrationId: The unique identifier for the registration.
    ///   - logger: Logger use during operation
    @inlinable
    public func listRegistrationAssociations(
        filters: [RegistrationAssociationFilter]? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        registrationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListRegistrationAssociationsResult {
        let input = ListRegistrationAssociationsRequest(
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            registrationId: registrationId
        )
        return try await self.listRegistrationAssociations(input, logger: logger)
    }

    /// List all tags associated with a resource.
    @Sendable
    @inlinable
    public func listTagsForResource(_ input: ListTagsForResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTagsForResourceResult {
        try await self.client.execute(
            operation: "ListTagsForResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// List all tags associated with a resource.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource to query for.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTagsForResource(
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTagsForResourceResult {
        let input = ListTagsForResourceRequest(
            resourceArn: resourceArn
        )
        return try await self.listTagsForResource(input, logger: logger)
    }

    /// Creates or updates a keyword configuration on an origination phone number or pool.  A keyword is a word that you can search for on a particular phone number or pool. It is also a specific word or phrase that an end user can send to your number to elicit a response, such as an informational message or a special offer. When your number receives a message that begins with a keyword, AWS End User Messaging SMS and Voice responds with a customizable message. If you specify a keyword that isn't valid, an error is returned.
    @Sendable
    @inlinable
    public func putKeyword(_ input: PutKeywordRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutKeywordResult {
        try await self.client.execute(
            operation: "PutKeyword", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates or updates a keyword configuration on an origination phone number or pool.  A keyword is a word that you can search for on a particular phone number or pool. It is also a specific word or phrase that an end user can send to your number to elicit a response, such as an informational message or a special offer. When your number receives a message that begins with a keyword, AWS End User Messaging SMS and Voice responds with a customizable message. If you specify a keyword that isn't valid, an error is returned.
    ///
    /// Parameters:
    ///   - keyword: The new keyword to add.
    ///   - keywordAction: The action to perform for the new keyword when it is received.   AUTOMATIC_RESPONSE: A message is sent to the recipient.   OPT_OUT: Keeps the recipient from receiving future messages.   OPT_IN: The recipient wants to receive future messages.
    ///   - keywordMessage: The message associated with the keyword.
    ///   - originationIdentity: The origination identity to use such as a PhoneNumberId, PhoneNumberArn, SenderId or SenderIdArn. You can use DescribePhoneNumbers get the values for PhoneNumberId and PhoneNumberArn while DescribeSenderIds can be used to get the values for SenderId and SenderIdArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - logger: Logger use during operation
    @inlinable
    public func putKeyword(
        keyword: String,
        keywordAction: KeywordAction? = nil,
        keywordMessage: String,
        originationIdentity: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutKeywordResult {
        let input = PutKeywordRequest(
            keyword: keyword, 
            keywordAction: keywordAction, 
            keywordMessage: keywordMessage, 
            originationIdentity: originationIdentity
        )
        return try await self.putKeyword(input, logger: logger)
    }

    /// Set the MessageFeedbackStatus as RECEIVED or FAILED for the passed in MessageId.  If you use message feedback then you must update message feedback record. When you receive a signal that a user has received the message you must use PutMessageFeedback to set the message feedback record as RECEIVED; Otherwise, an hour after the message feedback record is set to FAILED.
    @Sendable
    @inlinable
    public func putMessageFeedback(_ input: PutMessageFeedbackRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutMessageFeedbackResult {
        try await self.client.execute(
            operation: "PutMessageFeedback", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Set the MessageFeedbackStatus as RECEIVED or FAILED for the passed in MessageId.  If you use message feedback then you must update message feedback record. When you receive a signal that a user has received the message you must use PutMessageFeedback to set the message feedback record as RECEIVED; Otherwise, an hour after the message feedback record is set to FAILED.
    ///
    /// Parameters:
    ///   - messageFeedbackStatus: Set the message feedback to be either RECEIVED or FAILED.
    ///   - messageId: The unique identifier for the message.
    ///   - logger: Logger use during operation
    @inlinable
    public func putMessageFeedback(
        messageFeedbackStatus: MessageFeedbackStatus,
        messageId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutMessageFeedbackResult {
        let input = PutMessageFeedbackRequest(
            messageFeedbackStatus: messageFeedbackStatus, 
            messageId: messageId
        )
        return try await self.putMessageFeedback(input, logger: logger)
    }

    /// Creates an opted out destination phone number in the opt-out list. If the destination phone number isn't valid or if the specified opt-out list doesn't exist, an error is returned.
    @Sendable
    @inlinable
    public func putOptedOutNumber(_ input: PutOptedOutNumberRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutOptedOutNumberResult {
        try await self.client.execute(
            operation: "PutOptedOutNumber", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates an opted out destination phone number in the opt-out list. If the destination phone number isn't valid or if the specified opt-out list doesn't exist, an error is returned.
    ///
    /// Parameters:
    ///   - optedOutNumber: The phone number to add to the OptOutList in E.164 format.
    ///   - optOutListName: The OptOutListName or OptOutListArn to add the phone number to.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - logger: Logger use during operation
    @inlinable
    public func putOptedOutNumber(
        optedOutNumber: String,
        optOutListName: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutOptedOutNumberResult {
        let input = PutOptedOutNumberRequest(
            optedOutNumber: optedOutNumber, 
            optOutListName: optOutListName
        )
        return try await self.putOptedOutNumber(input, logger: logger)
    }

    /// Create or update a phone number rule override and associate it with a protect configuration.
    @Sendable
    @inlinable
    public func putProtectConfigurationRuleSetNumberOverride(_ input: PutProtectConfigurationRuleSetNumberOverrideRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutProtectConfigurationRuleSetNumberOverrideResult {
        try await self.client.execute(
            operation: "PutProtectConfigurationRuleSetNumberOverride", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Create or update a phone number rule override and associate it with a protect configuration.
    ///
    /// Parameters:
    ///   - action: The action for the rule to either block or allow messages to the destination phone number.
    ///   - clientToken: Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you don't specify a client token, a randomly generated token is used for the request to ensure idempotency.
    ///   - destinationPhoneNumber: The destination phone number in E.164 format.
    ///   - expirationTimestamp: The time the rule will expire at. If ExpirationTimestamp is not set then the rule does not expire.
    ///   - protectConfigurationId: The unique identifier for the protect configuration.
    ///   - logger: Logger use during operation
    @inlinable
    public func putProtectConfigurationRuleSetNumberOverride(
        action: ProtectConfigurationRuleOverrideAction,
        clientToken: String? = PutProtectConfigurationRuleSetNumberOverrideRequest.idempotencyToken(),
        destinationPhoneNumber: String,
        expirationTimestamp: Date? = nil,
        protectConfigurationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutProtectConfigurationRuleSetNumberOverrideResult {
        let input = PutProtectConfigurationRuleSetNumberOverrideRequest(
            action: action, 
            clientToken: clientToken, 
            destinationPhoneNumber: destinationPhoneNumber, 
            expirationTimestamp: expirationTimestamp, 
            protectConfigurationId: protectConfigurationId
        )
        return try await self.putProtectConfigurationRuleSetNumberOverride(input, logger: logger)
    }

    /// Creates or updates a field value for a registration.
    @Sendable
    @inlinable
    public func putRegistrationFieldValue(_ input: PutRegistrationFieldValueRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutRegistrationFieldValueResult {
        try await self.client.execute(
            operation: "PutRegistrationFieldValue", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates or updates a field value for a registration.
    ///
    /// Parameters:
    ///   - fieldPath: The path to the registration form field. You can use DescribeRegistrationFieldDefinitions for a list of FieldPaths.
    ///   - registrationAttachmentId: The unique identifier for the registration attachment.
    ///   - registrationId: The unique identifier for the registration.
    ///   - selectChoices: An array of values for the form field.
    ///   - textValue: The text data for a free form field.
    ///   - logger: Logger use during operation
    @inlinable
    public func putRegistrationFieldValue(
        fieldPath: String,
        registrationAttachmentId: String? = nil,
        registrationId: String,
        selectChoices: [String]? = nil,
        textValue: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutRegistrationFieldValueResult {
        let input = PutRegistrationFieldValueRequest(
            fieldPath: fieldPath, 
            registrationAttachmentId: registrationAttachmentId, 
            registrationId: registrationId, 
            selectChoices: selectChoices, 
            textValue: textValue
        )
        return try await self.putRegistrationFieldValue(input, logger: logger)
    }

    /// Attaches a resource-based policy to a AWS End User Messaging SMS and Voice resource(phone number, sender Id, phone poll, or opt-out list) that is used for sharing the resource. A shared resource can be a Pool, Opt-out list, Sender Id, or Phone number. For more information about resource-based policies, see Working with shared resources in the AWS End User Messaging SMS User Guide.
    @Sendable
    @inlinable
    public func putResourcePolicy(_ input: PutResourcePolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutResourcePolicyResult {
        try await self.client.execute(
            operation: "PutResourcePolicy", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Attaches a resource-based policy to a AWS End User Messaging SMS and Voice resource(phone number, sender Id, phone poll, or opt-out list) that is used for sharing the resource. A shared resource can be a Pool, Opt-out list, Sender Id, or Phone number. For more information about resource-based policies, see Working with shared resources in the AWS End User Messaging SMS User Guide.
    ///
    /// Parameters:
    ///   - policy: The JSON formatted resource-based policy to attach.
    ///   - resourceArn: The Amazon Resource Name (ARN) of the AWS End User Messaging SMS and Voice resource to attach the resource-based policy to.
    ///   - logger: Logger use during operation
    @inlinable
    public func putResourcePolicy(
        policy: String,
        resourceArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutResourcePolicyResult {
        let input = PutResourcePolicyRequest(
            policy: policy, 
            resourceArn: resourceArn
        )
        return try await self.putResourcePolicy(input, logger: logger)
    }

    /// Releases an existing origination phone number in your account. Once released, a phone number is no longer available for sending messages. If the origination phone number has deletion protection enabled or is associated with a pool, an error is returned.
    @Sendable
    @inlinable
    public func releasePhoneNumber(_ input: ReleasePhoneNumberRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ReleasePhoneNumberResult {
        try await self.client.execute(
            operation: "ReleasePhoneNumber", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Releases an existing origination phone number in your account. Once released, a phone number is no longer available for sending messages. If the origination phone number has deletion protection enabled or is associated with a pool, an error is returned.
    ///
    /// Parameters:
    ///   - phoneNumberId: The PhoneNumberId or PhoneNumberArn of the phone number to release. You can use DescribePhoneNumbers to get the values for PhoneNumberId and PhoneNumberArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - logger: Logger use during operation
    @inlinable
    public func releasePhoneNumber(
        phoneNumberId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ReleasePhoneNumberResult {
        let input = ReleasePhoneNumberRequest(
            phoneNumberId: phoneNumberId
        )
        return try await self.releasePhoneNumber(input, logger: logger)
    }

    /// Releases an existing sender ID in your account.
    @Sendable
    @inlinable
    public func releaseSenderId(_ input: ReleaseSenderIdRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ReleaseSenderIdResult {
        try await self.client.execute(
            operation: "ReleaseSenderId", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Releases an existing sender ID in your account.
    ///
    /// Parameters:
    ///   - isoCountryCode: The two-character code, in ISO 3166-1 alpha-2 format, for the country or region.
    ///   - senderId: The sender ID to release.
    ///   - logger: Logger use during operation
    @inlinable
    public func releaseSenderId(
        isoCountryCode: String,
        senderId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ReleaseSenderIdResult {
        let input = ReleaseSenderIdRequest(
            isoCountryCode: isoCountryCode, 
            senderId: senderId
        )
        return try await self.releaseSenderId(input, logger: logger)
    }

    /// Request an origination phone number for use in your account. For more information on phone number request see Request a phone number in the AWS End User Messaging SMS User Guide.
    @Sendable
    @inlinable
    public func requestPhoneNumber(_ input: RequestPhoneNumberRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> RequestPhoneNumberResult {
        try await self.client.execute(
            operation: "RequestPhoneNumber", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Request an origination phone number for use in your account. For more information on phone number request see Request a phone number in the AWS End User Messaging SMS User Guide.
    ///
    /// Parameters:
    ///   - clientToken: Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you don't specify a client token, a randomly generated token is used for the request to ensure idempotency.
    ///   - deletionProtectionEnabled: By default this is set to false. When set to true the phone number can't be deleted.
    ///   - isoCountryCode: The two-character code, in ISO 3166-1 alpha-2 format, for the country or region.
    ///   - messageType: The type of message. Valid values are TRANSACTIONAL for messages that are critical or time-sensitive and PROMOTIONAL for messages that aren't critical or time-sensitive.
    ///   - numberCapabilities: Indicates if the phone number will be used for text messages, voice messages, or both.
    ///   - numberType: The type of phone number to request. When you request a SIMULATOR phone number, you must set MessageType as TRANSACTIONAL.
    ///   - optOutListName: The name of the OptOutList to associate with the phone number. You can use the OptOutListName or OptOutListArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - poolId: The pool to associated with the phone number. You can use the PoolId or PoolArn.   If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - registrationId: Use this field to attach your phone number for an external registration process.
    ///   - tags: An array of tags (key and value pairs) associate with the requested phone number.
    ///   - logger: Logger use during operation
    @inlinable
    public func requestPhoneNumber(
        clientToken: String? = RequestPhoneNumberRequest.idempotencyToken(),
        deletionProtectionEnabled: Bool? = nil,
        isoCountryCode: String,
        messageType: MessageType,
        numberCapabilities: [NumberCapability],
        numberType: RequestableNumberType,
        optOutListName: String? = nil,
        poolId: String? = nil,
        registrationId: String? = nil,
        tags: [Tag]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> RequestPhoneNumberResult {
        let input = RequestPhoneNumberRequest(
            clientToken: clientToken, 
            deletionProtectionEnabled: deletionProtectionEnabled, 
            isoCountryCode: isoCountryCode, 
            messageType: messageType, 
            numberCapabilities: numberCapabilities, 
            numberType: numberType, 
            optOutListName: optOutListName, 
            poolId: poolId, 
            registrationId: registrationId, 
            tags: tags
        )
        return try await self.requestPhoneNumber(input, logger: logger)
    }

    /// Request a new sender ID that doesn't require registration.
    @Sendable
    @inlinable
    public func requestSenderId(_ input: RequestSenderIdRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> RequestSenderIdResult {
        try await self.client.execute(
            operation: "RequestSenderId", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Request a new sender ID that doesn't require registration.
    ///
    /// Parameters:
    ///   - clientToken: Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. If you don't specify a client token, a randomly generated token is used for the request to ensure idempotency.
    ///   - deletionProtectionEnabled: By default this is set to false. When set to true the sender ID can't be deleted.
    ///   - isoCountryCode: The two-character code, in ISO 3166-1 alpha-2 format, for the country or region.
    ///   - messageTypes: The type of message. Valid values are TRANSACTIONAL for messages that are critical or time-sensitive and PROMOTIONAL for messages that aren't critical or time-sensitive.
    ///   - senderId: The sender ID string to request.
    ///   - tags: An array of tags (key and value pairs) to associate with the sender ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func requestSenderId(
        clientToken: String? = RequestSenderIdRequest.idempotencyToken(),
        deletionProtectionEnabled: Bool? = nil,
        isoCountryCode: String,
        messageTypes: [MessageType]? = nil,
        senderId: String,
        tags: [Tag]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> RequestSenderIdResult {
        let input = RequestSenderIdRequest(
            clientToken: clientToken, 
            deletionProtectionEnabled: deletionProtectionEnabled, 
            isoCountryCode: isoCountryCode, 
            messageTypes: messageTypes, 
            senderId: senderId, 
            tags: tags
        )
        return try await self.requestSenderId(input, logger: logger)
    }

    /// Before you can send test messages to a verified destination phone number you need to opt-in the verified destination phone number. Creates a new text message with a verification code and send it to a verified destination phone number. Once you have the verification code use VerifyDestinationNumber to opt-in the verified destination phone number to receive messages.
    @Sendable
    @inlinable
    public func sendDestinationNumberVerificationCode(_ input: SendDestinationNumberVerificationCodeRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> SendDestinationNumberVerificationCodeResult {
        try await self.client.execute(
            operation: "SendDestinationNumberVerificationCode", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Before you can send test messages to a verified destination phone number you need to opt-in the verified destination phone number. Creates a new text message with a verification code and send it to a verified destination phone number. Once you have the verification code use VerifyDestinationNumber to opt-in the verified destination phone number to receive messages.
    ///
    /// Parameters:
    ///   - configurationSetName: The name of the configuration set to use. This can be either the ConfigurationSetName or ConfigurationSetArn.
    ///   - context: You can specify custom data in this field. If you do, that data is logged to the event destination.
    ///   - destinationCountryParameters: This field is used for any country-specific registration requirements. Currently, this setting is only used when you send messages to recipients in India using a sender ID. For more information see Special requirements for sending SMS messages to recipients in India.
    ///   - languageCode: Choose the language to use for the message.
    ///   - originationIdentity: The origination identity of the message. This can be either the PhoneNumber, PhoneNumberId, PhoneNumberArn, SenderId, SenderIdArn, PoolId, or PoolArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - verificationChannel: Choose to send the verification code as an SMS or voice message.
    ///   - verifiedDestinationNumberId: The unique identifier for the verified destination phone number.
    ///   - logger: Logger use during operation
    @inlinable
    public func sendDestinationNumberVerificationCode(
        configurationSetName: String? = nil,
        context: [String: String]? = nil,
        destinationCountryParameters: [DestinationCountryParameterKey: String]? = nil,
        languageCode: LanguageCode? = nil,
        originationIdentity: String? = nil,
        verificationChannel: VerificationChannel,
        verifiedDestinationNumberId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> SendDestinationNumberVerificationCodeResult {
        let input = SendDestinationNumberVerificationCodeRequest(
            configurationSetName: configurationSetName, 
            context: context, 
            destinationCountryParameters: destinationCountryParameters, 
            languageCode: languageCode, 
            originationIdentity: originationIdentity, 
            verificationChannel: verificationChannel, 
            verifiedDestinationNumberId: verifiedDestinationNumberId
        )
        return try await self.sendDestinationNumberVerificationCode(input, logger: logger)
    }

    /// Creates a new multimedia message (MMS) and sends it to a recipient's phone number.
    @Sendable
    @inlinable
    public func sendMediaMessage(_ input: SendMediaMessageRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> SendMediaMessageResult {
        try await self.client.execute(
            operation: "SendMediaMessage", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new multimedia message (MMS) and sends it to a recipient's phone number.
    ///
    /// Parameters:
    ///   - configurationSetName: The name of the configuration set to use. This can be either the ConfigurationSetName or ConfigurationSetArn.
    ///   - context: You can specify custom data in this field. If you do, that data is logged to the event destination.
    ///   - destinationPhoneNumber: The destination phone number in E.164 format.
    ///   - dryRun: When set to true, the message is checked and validated, but isn't sent to the end recipient.
    ///   - maxPrice: The maximum amount that you want to spend, in US dollars, per each MMS message.
    ///   - mediaUrls: An array of URLs to each media file to send.  The media files have to be stored in an S3 bucket. Supported media file formats are listed in MMS file types, size and character limits. For more information on creating an S3 bucket and managing objects, see Creating a bucket, Uploading objects in the Amazon S3 User Guide, and Setting up an Amazon S3 bucket for MMS files in the Amazon Web Services End User Messaging SMS User Guide.
    ///   - messageBody: The text body of the message.
    ///   - messageFeedbackEnabled: Set to true to enable message feedback for the message. When a user receives the message you need to update the message status using PutMessageFeedback.
    ///   - originationIdentity: The origination identity of the message. This can be either the PhoneNumber, PhoneNumberId, PhoneNumberArn, SenderId, SenderIdArn, PoolId, or PoolArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - protectConfigurationId: The unique identifier of the protect configuration to use.
    ///   - timeToLive: How long the media message is valid for. By default this is 72 hours.
    ///   - logger: Logger use during operation
    @inlinable
    public func sendMediaMessage(
        configurationSetName: String? = nil,
        context: [String: String]? = nil,
        destinationPhoneNumber: String,
        dryRun: Bool? = nil,
        maxPrice: String? = nil,
        mediaUrls: [String]? = nil,
        messageBody: String? = nil,
        messageFeedbackEnabled: Bool? = nil,
        originationIdentity: String,
        protectConfigurationId: String? = nil,
        timeToLive: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> SendMediaMessageResult {
        let input = SendMediaMessageRequest(
            configurationSetName: configurationSetName, 
            context: context, 
            destinationPhoneNumber: destinationPhoneNumber, 
            dryRun: dryRun, 
            maxPrice: maxPrice, 
            mediaUrls: mediaUrls, 
            messageBody: messageBody, 
            messageFeedbackEnabled: messageFeedbackEnabled, 
            originationIdentity: originationIdentity, 
            protectConfigurationId: protectConfigurationId, 
            timeToLive: timeToLive
        )
        return try await self.sendMediaMessage(input, logger: logger)
    }

    /// Creates a new text message and sends it to a recipient's phone number. SendTextMessage only sends an SMS message to one recipient each time it is invoked. SMS throughput limits are measured in Message Parts per Second (MPS). Your MPS limit depends on the destination country of your messages, as well as the type of phone number (origination number) that you use to send the message. For more information about MPS, see Message Parts per Second (MPS) limits in the AWS End User Messaging SMS User Guide.
    @Sendable
    @inlinable
    public func sendTextMessage(_ input: SendTextMessageRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> SendTextMessageResult {
        try await self.client.execute(
            operation: "SendTextMessage", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new text message and sends it to a recipient's phone number. SendTextMessage only sends an SMS message to one recipient each time it is invoked. SMS throughput limits are measured in Message Parts per Second (MPS). Your MPS limit depends on the destination country of your messages, as well as the type of phone number (origination number) that you use to send the message. For more information about MPS, see Message Parts per Second (MPS) limits in the AWS End User Messaging SMS User Guide.
    ///
    /// Parameters:
    ///   - configurationSetName: The name of the configuration set to use. This can be either the ConfigurationSetName or ConfigurationSetArn.
    ///   - context: You can specify custom data in this field. If you do, that data is logged to the event destination.
    ///   - destinationCountryParameters: This field is used for any country-specific registration requirements. Currently, this setting is only used when you send messages to recipients in India using a sender ID. For more information see Special requirements for sending SMS messages to recipients in India.     IN_ENTITY_ID The entity ID or Principal Entity (PE) ID that you received after completing the sender ID registration process.    IN_TEMPLATE_ID The template ID that you received after completing the sender ID registration process.  Make sure that the Template ID that you specify matches your message template exactly. If your message doesn't match the template that you provided during the registration process, the mobile carriers might reject your message.
    ///   - destinationPhoneNumber: The destination phone number in E.164 format.
    ///   - dryRun: When set to true, the message is checked and validated, but isn't sent to the end recipient. You are not charged for using DryRun. The Message Parts per Second (MPS) limit when using DryRun is five. If your origination identity has a lower MPS limit then the lower MPS limit is used. For more information about MPS limits, see Message Parts per Second (MPS) limits in the AWS End User Messaging SMS User Guide..
    ///   - keyword: When you register a short code in the US, you must specify a program name. If you don’t have a US short code, omit this attribute.
    ///   - maxPrice: The maximum amount that you want to spend, in US dollars, per each text message. If the calculated amount to send the text message is greater than MaxPrice, the message is not sent and an error is returned.
    ///   - messageBody: The body of the text message.
    ///   - messageFeedbackEnabled: Set to true to enable message feedback for the message. When a user receives the message you need to update the message status using PutMessageFeedback.
    ///   - messageType: The type of message. Valid values are for messages that are critical or time-sensitive and PROMOTIONAL for messages that aren't critical or time-sensitive.
    ///   - originationIdentity: The origination identity of the message. This can be either the PhoneNumber, PhoneNumberId, PhoneNumberArn, SenderId, SenderIdArn, PoolId, or PoolArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - protectConfigurationId: The unique identifier for the protect configuration.
    ///   - timeToLive: How long the text message is valid for, in seconds. By default this is 72 hours. If the messages isn't handed off before the TTL expires we stop attempting to hand off the message and return TTL_EXPIRED event.
    ///   - logger: Logger use during operation
    @inlinable
    public func sendTextMessage(
        configurationSetName: String? = nil,
        context: [String: String]? = nil,
        destinationCountryParameters: [DestinationCountryParameterKey: String]? = nil,
        destinationPhoneNumber: String,
        dryRun: Bool? = nil,
        keyword: String? = nil,
        maxPrice: String? = nil,
        messageBody: String? = nil,
        messageFeedbackEnabled: Bool? = nil,
        messageType: MessageType? = nil,
        originationIdentity: String? = nil,
        protectConfigurationId: String? = nil,
        timeToLive: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> SendTextMessageResult {
        let input = SendTextMessageRequest(
            configurationSetName: configurationSetName, 
            context: context, 
            destinationCountryParameters: destinationCountryParameters, 
            destinationPhoneNumber: destinationPhoneNumber, 
            dryRun: dryRun, 
            keyword: keyword, 
            maxPrice: maxPrice, 
            messageBody: messageBody, 
            messageFeedbackEnabled: messageFeedbackEnabled, 
            messageType: messageType, 
            originationIdentity: originationIdentity, 
            protectConfigurationId: protectConfigurationId, 
            timeToLive: timeToLive
        )
        return try await self.sendTextMessage(input, logger: logger)
    }

    /// Allows you to send a request that sends a voice message. This operation uses Amazon Polly to convert a text script into a voice message.
    @Sendable
    @inlinable
    public func sendVoiceMessage(_ input: SendVoiceMessageRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> SendVoiceMessageResult {
        try await self.client.execute(
            operation: "SendVoiceMessage", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Allows you to send a request that sends a voice message. This operation uses Amazon Polly to convert a text script into a voice message.
    ///
    /// Parameters:
    ///   - configurationSetName: The name of the configuration set to use. This can be either the ConfigurationSetName or ConfigurationSetArn.
    ///   - context: You can specify custom data in this field. If you do, that data is logged to the event destination.
    ///   - destinationPhoneNumber: The destination phone number in E.164 format.
    ///   - dryRun: When set to true, the message is checked and validated, but isn't sent to the end recipient.
    ///   - maxPricePerMinute: The maximum amount to spend per voice message, in US dollars.
    ///   - messageBody: The text to convert to a voice message.
    ///   - messageBodyTextType: Specifies if the MessageBody field contains text or speech synthesis markup language (SSML).   TEXT: This is the default value. When used the maximum character limit is 3000.   SSML: When used the maximum character limit is 6000 including SSML tagging.
    ///   - messageFeedbackEnabled: Set to true to enable message feedback for the message. When a user receives the message you need to update the message status using PutMessageFeedback.
    ///   - originationIdentity: The origination identity to use for the voice call. This can be the PhoneNumber, PhoneNumberId, PhoneNumberArn, PoolId, or PoolArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - protectConfigurationId: The unique identifier for the protect configuration.
    ///   - timeToLive: How long the voice message is valid for. By default this is 72 hours.
    ///   - voiceId: The voice for the Amazon Polly service to use. By default this is set to "MATTHEW".
    ///   - logger: Logger use during operation
    @inlinable
    public func sendVoiceMessage(
        configurationSetName: String? = nil,
        context: [String: String]? = nil,
        destinationPhoneNumber: String,
        dryRun: Bool? = nil,
        maxPricePerMinute: String? = nil,
        messageBody: String? = nil,
        messageBodyTextType: VoiceMessageBodyTextType? = nil,
        messageFeedbackEnabled: Bool? = nil,
        originationIdentity: String,
        protectConfigurationId: String? = nil,
        timeToLive: Int? = nil,
        voiceId: VoiceId? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> SendVoiceMessageResult {
        let input = SendVoiceMessageRequest(
            configurationSetName: configurationSetName, 
            context: context, 
            destinationPhoneNumber: destinationPhoneNumber, 
            dryRun: dryRun, 
            maxPricePerMinute: maxPricePerMinute, 
            messageBody: messageBody, 
            messageBodyTextType: messageBodyTextType, 
            messageFeedbackEnabled: messageFeedbackEnabled, 
            originationIdentity: originationIdentity, 
            protectConfigurationId: protectConfigurationId, 
            timeToLive: timeToLive, 
            voiceId: voiceId
        )
        return try await self.sendVoiceMessage(input, logger: logger)
    }

    /// Set a protect configuration as your account default. You can only have one account default protect configuration at a time. The current account default protect configuration is replaced with the provided protect configuration.
    @Sendable
    @inlinable
    public func setAccountDefaultProtectConfiguration(_ input: SetAccountDefaultProtectConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> SetAccountDefaultProtectConfigurationResult {
        try await self.client.execute(
            operation: "SetAccountDefaultProtectConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Set a protect configuration as your account default. You can only have one account default protect configuration at a time. The current account default protect configuration is replaced with the provided protect configuration.
    ///
    /// Parameters:
    ///   - protectConfigurationId: The unique identifier for the protect configuration.
    ///   - logger: Logger use during operation
    @inlinable
    public func setAccountDefaultProtectConfiguration(
        protectConfigurationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> SetAccountDefaultProtectConfigurationResult {
        let input = SetAccountDefaultProtectConfigurationRequest(
            protectConfigurationId: protectConfigurationId
        )
        return try await self.setAccountDefaultProtectConfiguration(input, logger: logger)
    }

    /// Sets a configuration set's default for message feedback.
    @Sendable
    @inlinable
    public func setDefaultMessageFeedbackEnabled(_ input: SetDefaultMessageFeedbackEnabledRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> SetDefaultMessageFeedbackEnabledResult {
        try await self.client.execute(
            operation: "SetDefaultMessageFeedbackEnabled", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Sets a configuration set's default for message feedback.
    ///
    /// Parameters:
    ///   - configurationSetName: The name of the configuration set to use. This can be either the ConfigurationSetName or ConfigurationSetArn.
    ///   - messageFeedbackEnabled: Set to true to enable message feedback.
    ///   - logger: Logger use during operation
    @inlinable
    public func setDefaultMessageFeedbackEnabled(
        configurationSetName: String,
        messageFeedbackEnabled: Bool,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> SetDefaultMessageFeedbackEnabledResult {
        let input = SetDefaultMessageFeedbackEnabledRequest(
            configurationSetName: configurationSetName, 
            messageFeedbackEnabled: messageFeedbackEnabled
        )
        return try await self.setDefaultMessageFeedbackEnabled(input, logger: logger)
    }

    /// Sets the default message type on a configuration set. Choose the category of SMS messages that you plan to send from this account. If you send account-related messages or time-sensitive messages such as one-time passcodes, choose Transactional. If you plan to send messages that contain marketing material or other promotional content, choose Promotional. This setting applies to your entire Amazon Web Services account.
    @Sendable
    @inlinable
    public func setDefaultMessageType(_ input: SetDefaultMessageTypeRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> SetDefaultMessageTypeResult {
        try await self.client.execute(
            operation: "SetDefaultMessageType", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Sets the default message type on a configuration set. Choose the category of SMS messages that you plan to send from this account. If you send account-related messages or time-sensitive messages such as one-time passcodes, choose Transactional. If you plan to send messages that contain marketing material or other promotional content, choose Promotional. This setting applies to your entire Amazon Web Services account.
    ///
    /// Parameters:
    ///   - configurationSetName: The configuration set to update with a new default message type. This field can be the ConsigurationSetName or ConfigurationSetArn.
    ///   - messageType: The type of message. Valid values are TRANSACTIONAL for messages that are critical or time-sensitive and PROMOTIONAL for messages that aren't critical or time-sensitive.
    ///   - logger: Logger use during operation
    @inlinable
    public func setDefaultMessageType(
        configurationSetName: String,
        messageType: MessageType,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> SetDefaultMessageTypeResult {
        let input = SetDefaultMessageTypeRequest(
            configurationSetName: configurationSetName, 
            messageType: messageType
        )
        return try await self.setDefaultMessageType(input, logger: logger)
    }

    /// Sets default sender ID on a configuration set. When sending a text message to a destination country that supports sender IDs, the default sender ID on the configuration set specified will be used if no dedicated origination phone numbers or registered sender IDs are available in your account.
    @Sendable
    @inlinable
    public func setDefaultSenderId(_ input: SetDefaultSenderIdRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> SetDefaultSenderIdResult {
        try await self.client.execute(
            operation: "SetDefaultSenderId", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Sets default sender ID on a configuration set. When sending a text message to a destination country that supports sender IDs, the default sender ID on the configuration set specified will be used if no dedicated origination phone numbers or registered sender IDs are available in your account.
    ///
    /// Parameters:
    ///   - configurationSetName: The configuration set to updated with a new default SenderId. This field can be the ConsigurationSetName or ConfigurationSetArn.
    ///   - senderId: The current sender ID for the configuration set. When sending a text message to a destination country which supports SenderIds, the default sender ID on the configuration set specified on SendTextMessage will be used if no dedicated origination phone numbers or registered SenderIds are available in your account, instead of a generic sender ID, such as 'NOTICE'.
    ///   - logger: Logger use during operation
    @inlinable
    public func setDefaultSenderId(
        configurationSetName: String,
        senderId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> SetDefaultSenderIdResult {
        let input = SetDefaultSenderIdRequest(
            configurationSetName: configurationSetName, 
            senderId: senderId
        )
        return try await self.setDefaultSenderId(input, logger: logger)
    }

    /// Sets an account level monthly spend limit override for sending MMS messages. The requested spend limit must be less than or equal to the MaxLimit, which is set by Amazon Web Services.
    @Sendable
    @inlinable
    public func setMediaMessageSpendLimitOverride(_ input: SetMediaMessageSpendLimitOverrideRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> SetMediaMessageSpendLimitOverrideResult {
        try await self.client.execute(
            operation: "SetMediaMessageSpendLimitOverride", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Sets an account level monthly spend limit override for sending MMS messages. The requested spend limit must be less than or equal to the MaxLimit, which is set by Amazon Web Services.
    ///
    /// Parameters:
    ///   - monthlyLimit: The new monthly limit to enforce on text messages.
    ///   - logger: Logger use during operation
    @inlinable
    public func setMediaMessageSpendLimitOverride(
        monthlyLimit: Int64,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> SetMediaMessageSpendLimitOverrideResult {
        let input = SetMediaMessageSpendLimitOverrideRequest(
            monthlyLimit: monthlyLimit
        )
        return try await self.setMediaMessageSpendLimitOverride(input, logger: logger)
    }

    /// Sets an account level monthly spend limit override for sending text messages. The requested spend limit must be less than or equal to the MaxLimit, which is set by Amazon Web Services.
    @Sendable
    @inlinable
    public func setTextMessageSpendLimitOverride(_ input: SetTextMessageSpendLimitOverrideRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> SetTextMessageSpendLimitOverrideResult {
        try await self.client.execute(
            operation: "SetTextMessageSpendLimitOverride", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Sets an account level monthly spend limit override for sending text messages. The requested spend limit must be less than or equal to the MaxLimit, which is set by Amazon Web Services.
    ///
    /// Parameters:
    ///   - monthlyLimit: The new monthly limit to enforce on text messages.
    ///   - logger: Logger use during operation
    @inlinable
    public func setTextMessageSpendLimitOverride(
        monthlyLimit: Int64,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> SetTextMessageSpendLimitOverrideResult {
        let input = SetTextMessageSpendLimitOverrideRequest(
            monthlyLimit: monthlyLimit
        )
        return try await self.setTextMessageSpendLimitOverride(input, logger: logger)
    }

    /// Sets an account level monthly spend limit override for sending voice messages. The requested spend limit must be less than or equal to the MaxLimit, which is set by Amazon Web Services.
    @Sendable
    @inlinable
    public func setVoiceMessageSpendLimitOverride(_ input: SetVoiceMessageSpendLimitOverrideRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> SetVoiceMessageSpendLimitOverrideResult {
        try await self.client.execute(
            operation: "SetVoiceMessageSpendLimitOverride", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Sets an account level monthly spend limit override for sending voice messages. The requested spend limit must be less than or equal to the MaxLimit, which is set by Amazon Web Services.
    ///
    /// Parameters:
    ///   - monthlyLimit: The new monthly limit to enforce on voice messages.
    ///   - logger: Logger use during operation
    @inlinable
    public func setVoiceMessageSpendLimitOverride(
        monthlyLimit: Int64,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> SetVoiceMessageSpendLimitOverrideResult {
        let input = SetVoiceMessageSpendLimitOverrideRequest(
            monthlyLimit: monthlyLimit
        )
        return try await self.setVoiceMessageSpendLimitOverride(input, logger: logger)
    }

    /// Submit the specified registration for review and approval.
    @Sendable
    @inlinable
    public func submitRegistrationVersion(_ input: SubmitRegistrationVersionRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> SubmitRegistrationVersionResult {
        try await self.client.execute(
            operation: "SubmitRegistrationVersion", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Submit the specified registration for review and approval.
    ///
    /// Parameters:
    ///   - registrationId: The unique identifier for the registration.
    ///   - logger: Logger use during operation
    @inlinable
    public func submitRegistrationVersion(
        registrationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> SubmitRegistrationVersionResult {
        let input = SubmitRegistrationVersionRequest(
            registrationId: registrationId
        )
        return try await self.submitRegistrationVersion(input, logger: logger)
    }

    /// Adds or overwrites only the specified tags for the specified resource. When you specify an existing tag key, the value is overwritten with the new value. Each tag consists of a key and an optional value. Tag keys must be unique per resource. For more information about tags, see Tags  in the AWS End User Messaging SMS User Guide.
    @Sendable
    @inlinable
    public func tagResource(_ input: TagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> TagResourceResult {
        try await self.client.execute(
            operation: "TagResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Adds or overwrites only the specified tags for the specified resource. When you specify an existing tag key, the value is overwritten with the new value. Each tag consists of a key and an optional value. Tag keys must be unique per resource. For more information about tags, see Tags  in the AWS End User Messaging SMS User Guide.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource.
    ///   - tags: An array of key and value pair tags that are associated with the resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func tagResource(
        resourceArn: String,
        tags: [Tag],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> TagResourceResult {
        let input = TagResourceRequest(
            resourceArn: resourceArn, 
            tags: tags
        )
        return try await self.tagResource(input, logger: logger)
    }

    /// Removes the association of the specified tags from a resource. For more information on tags see Tags  in the AWS End User Messaging SMS User Guide.
    @Sendable
    @inlinable
    public func untagResource(_ input: UntagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UntagResourceResult {
        try await self.client.execute(
            operation: "UntagResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes the association of the specified tags from a resource. For more information on tags see Tags  in the AWS End User Messaging SMS User Guide.
    ///
    /// Parameters:
    ///   - resourceArn: The Amazon Resource Name (ARN) of the resource.
    ///   - tagKeys: An array of tag key values to unassociate with the resource.
    ///   - logger: Logger use during operation
    @inlinable
    public func untagResource(
        resourceArn: String,
        tagKeys: [String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UntagResourceResult {
        let input = UntagResourceRequest(
            resourceArn: resourceArn, 
            tagKeys: tagKeys
        )
        return try await self.untagResource(input, logger: logger)
    }

    /// Updates an existing event destination in a configuration set. You can update the IAM role ARN for CloudWatch Logs and Firehose. You can also enable or disable the event destination. You may want to update an event destination to change its matching event types or updating the destination resource ARN. You can't change an event destination's type between CloudWatch Logs, Firehose, and Amazon SNS.
    @Sendable
    @inlinable
    public func updateEventDestination(_ input: UpdateEventDestinationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateEventDestinationResult {
        try await self.client.execute(
            operation: "UpdateEventDestination", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates an existing event destination in a configuration set. You can update the IAM role ARN for CloudWatch Logs and Firehose. You can also enable or disable the event destination. You may want to update an event destination to change its matching event types or updating the destination resource ARN. You can't change an event destination's type between CloudWatch Logs, Firehose, and Amazon SNS.
    ///
    /// Parameters:
    ///   - cloudWatchLogsDestination: An object that contains information about an event destination that sends data to CloudWatch Logs.
    ///   - configurationSetName: The configuration set to update with the new event destination. Valid values for this can be the ConfigurationSetName or ConfigurationSetArn.
    ///   - enabled: When set to true logging is enabled.
    ///   - eventDestinationName: The name to use for the event destination.
    ///   - kinesisFirehoseDestination: An object that contains information about an event destination for logging to Firehose.
    ///   - matchingEventTypes: An array of event types that determine which events to log.  The TEXT_SENT event type is not supported.
    ///   - snsDestination: An object that contains information about an event destination that sends data to Amazon SNS.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateEventDestination(
        cloudWatchLogsDestination: CloudWatchLogsDestination? = nil,
        configurationSetName: String,
        enabled: Bool? = nil,
        eventDestinationName: String,
        kinesisFirehoseDestination: KinesisFirehoseDestination? = nil,
        matchingEventTypes: [EventType]? = nil,
        snsDestination: SnsDestination? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateEventDestinationResult {
        let input = UpdateEventDestinationRequest(
            cloudWatchLogsDestination: cloudWatchLogsDestination, 
            configurationSetName: configurationSetName, 
            enabled: enabled, 
            eventDestinationName: eventDestinationName, 
            kinesisFirehoseDestination: kinesisFirehoseDestination, 
            matchingEventTypes: matchingEventTypes, 
            snsDestination: snsDestination
        )
        return try await self.updateEventDestination(input, logger: logger)
    }

    /// Updates the configuration of an existing origination phone number. You can update the opt-out list, enable or disable two-way messaging, change the TwoWayChannelArn, enable or disable self-managed opt-outs, and enable or disable deletion protection. If the origination phone number is associated with a pool, an error is returned.
    @Sendable
    @inlinable
    public func updatePhoneNumber(_ input: UpdatePhoneNumberRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdatePhoneNumberResult {
        try await self.client.execute(
            operation: "UpdatePhoneNumber", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates the configuration of an existing origination phone number. You can update the opt-out list, enable or disable two-way messaging, change the TwoWayChannelArn, enable or disable self-managed opt-outs, and enable or disable deletion protection. If the origination phone number is associated with a pool, an error is returned.
    ///
    /// Parameters:
    ///   - deletionProtectionEnabled: By default this is set to false. When set to true the phone number can't be deleted.
    ///   - optOutListName: The OptOutList to add the phone number to. Valid values for this field can be either the OutOutListName or OutOutListArn.
    ///   - phoneNumberId: The unique identifier of the phone number. Valid values for this field can be either the PhoneNumberId or PhoneNumberArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - selfManagedOptOutsEnabled: By default this is set to false. When an end recipient sends a message that begins with HELP or STOP to one of your dedicated numbers, AWS End User Messaging SMS and Voice automatically replies with a customizable message and adds the end recipient to the OptOutList. When set to true you're responsible for responding to HELP and STOP requests. You're also responsible for tracking and honoring opt-out requests.
    ///   - twoWayChannelArn: The Amazon Resource Name (ARN) of the two way channel.
    ///   - twoWayChannelRole: An optional IAM Role Arn for a service to assume, to be able to post inbound SMS messages.
    ///   - twoWayEnabled: By default this is set to false. When set to true you can receive incoming text messages from your end recipients.
    ///   - logger: Logger use during operation
    @inlinable
    public func updatePhoneNumber(
        deletionProtectionEnabled: Bool? = nil,
        optOutListName: String? = nil,
        phoneNumberId: String,
        selfManagedOptOutsEnabled: Bool? = nil,
        twoWayChannelArn: String? = nil,
        twoWayChannelRole: String? = nil,
        twoWayEnabled: Bool? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdatePhoneNumberResult {
        let input = UpdatePhoneNumberRequest(
            deletionProtectionEnabled: deletionProtectionEnabled, 
            optOutListName: optOutListName, 
            phoneNumberId: phoneNumberId, 
            selfManagedOptOutsEnabled: selfManagedOptOutsEnabled, 
            twoWayChannelArn: twoWayChannelArn, 
            twoWayChannelRole: twoWayChannelRole, 
            twoWayEnabled: twoWayEnabled
        )
        return try await self.updatePhoneNumber(input, logger: logger)
    }

    /// Updates the configuration of an existing pool. You can update the opt-out list, enable or disable two-way messaging, change the TwoWayChannelArn, enable or disable self-managed opt-outs, enable or disable deletion protection, and enable or disable shared routes.
    @Sendable
    @inlinable
    public func updatePool(_ input: UpdatePoolRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdatePoolResult {
        try await self.client.execute(
            operation: "UpdatePool", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates the configuration of an existing pool. You can update the opt-out list, enable or disable two-way messaging, change the TwoWayChannelArn, enable or disable self-managed opt-outs, enable or disable deletion protection, and enable or disable shared routes.
    ///
    /// Parameters:
    ///   - deletionProtectionEnabled: When set to true the pool can't be deleted.
    ///   - optOutListName: The OptOutList to associate with the pool. Valid values are either OptOutListName or OptOutListArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - poolId: The unique identifier of the pool to update. Valid values are either the PoolId or PoolArn.  If you are using a shared AWS End User Messaging SMS and Voice resource then you must use the full Amazon Resource Name(ARN).
    ///   - selfManagedOptOutsEnabled: By default this is set to false. When an end recipient sends a message that begins with HELP or STOP to one of your dedicated numbers, AWS End User Messaging SMS and Voice automatically replies with a customizable message and adds the end recipient to the OptOutList. When set to true you're responsible for responding to HELP and STOP requests. You're also responsible for tracking and honoring opt-out requests.
    ///   - sharedRoutesEnabled: Indicates whether shared routes are enabled for the pool.
    ///   - twoWayChannelArn: The Amazon Resource Name (ARN) of the two way channel.
    ///   - twoWayChannelRole: An optional IAM Role Arn for a service to assume, to be able to post inbound SMS messages.
    ///   - twoWayEnabled: By default this is set to false. When set to true you can receive incoming text messages from your end recipients.
    ///   - logger: Logger use during operation
    @inlinable
    public func updatePool(
        deletionProtectionEnabled: Bool? = nil,
        optOutListName: String? = nil,
        poolId: String,
        selfManagedOptOutsEnabled: Bool? = nil,
        sharedRoutesEnabled: Bool? = nil,
        twoWayChannelArn: String? = nil,
        twoWayChannelRole: String? = nil,
        twoWayEnabled: Bool? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdatePoolResult {
        let input = UpdatePoolRequest(
            deletionProtectionEnabled: deletionProtectionEnabled, 
            optOutListName: optOutListName, 
            poolId: poolId, 
            selfManagedOptOutsEnabled: selfManagedOptOutsEnabled, 
            sharedRoutesEnabled: sharedRoutesEnabled, 
            twoWayChannelArn: twoWayChannelArn, 
            twoWayChannelRole: twoWayChannelRole, 
            twoWayEnabled: twoWayEnabled
        )
        return try await self.updatePool(input, logger: logger)
    }

    /// Update the setting for an existing protect configuration.
    @Sendable
    @inlinable
    public func updateProtectConfiguration(_ input: UpdateProtectConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateProtectConfigurationResult {
        try await self.client.execute(
            operation: "UpdateProtectConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Update the setting for an existing protect configuration.
    ///
    /// Parameters:
    ///   - deletionProtectionEnabled: When set to true deletion protection is enabled. By default this is set to false.
    ///   - protectConfigurationId: The unique identifier for the protect configuration.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateProtectConfiguration(
        deletionProtectionEnabled: Bool? = nil,
        protectConfigurationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateProtectConfigurationResult {
        let input = UpdateProtectConfigurationRequest(
            deletionProtectionEnabled: deletionProtectionEnabled, 
            protectConfigurationId: protectConfigurationId
        )
        return try await self.updateProtectConfiguration(input, logger: logger)
    }

    /// Update a country rule set to ALLOW, BLOCK, MONITOR, or FILTER messages to be sent to the specified destination counties. You can update one or multiple countries at a time. The updates are only applied to the specified NumberCapability type.
    @Sendable
    @inlinable
    public func updateProtectConfigurationCountryRuleSet(_ input: UpdateProtectConfigurationCountryRuleSetRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateProtectConfigurationCountryRuleSetResult {
        try await self.client.execute(
            operation: "UpdateProtectConfigurationCountryRuleSet", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Update a country rule set to ALLOW, BLOCK, MONITOR, or FILTER messages to be sent to the specified destination counties. You can update one or multiple countries at a time. The updates are only applied to the specified NumberCapability type.
    ///
    /// Parameters:
    ///   - countryRuleSetUpdates: A map of ProtectConfigurationCountryRuleSetInformation objects that contain the details for the requested NumberCapability. The Key is the two-letter ISO country code. For a list of supported ISO country codes, see Supported countries and regions (SMS channel) in the AWS End User Messaging SMS User Guide. For example, to set the United States as allowed and Canada as blocked, the CountryRuleSetUpdates would be formatted as: "CountryRuleSetUpdates": { "US" : { "ProtectStatus": "ALLOW" } "CA" : { "ProtectStatus": "BLOCK" } }
    ///   - numberCapability: The number capability to apply the CountryRuleSetUpdates updates to.
    ///   - protectConfigurationId: The unique identifier for the protect configuration.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateProtectConfigurationCountryRuleSet(
        countryRuleSetUpdates: [String: ProtectConfigurationCountryRuleSetInformation],
        numberCapability: NumberCapability,
        protectConfigurationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateProtectConfigurationCountryRuleSetResult {
        let input = UpdateProtectConfigurationCountryRuleSetRequest(
            countryRuleSetUpdates: countryRuleSetUpdates, 
            numberCapability: numberCapability, 
            protectConfigurationId: protectConfigurationId
        )
        return try await self.updateProtectConfigurationCountryRuleSet(input, logger: logger)
    }

    /// Updates the configuration of an existing sender ID.
    @Sendable
    @inlinable
    public func updateSenderId(_ input: UpdateSenderIdRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateSenderIdResult {
        try await self.client.execute(
            operation: "UpdateSenderId", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates the configuration of an existing sender ID.
    ///
    /// Parameters:
    ///   - deletionProtectionEnabled: By default this is set to false. When set to true the sender ID can't be deleted.
    ///   - isoCountryCode: The two-character code, in ISO 3166-1 alpha-2 format, for the country or region.
    ///   - senderId: The sender ID to update.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateSenderId(
        deletionProtectionEnabled: Bool? = nil,
        isoCountryCode: String,
        senderId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateSenderIdResult {
        let input = UpdateSenderIdRequest(
            deletionProtectionEnabled: deletionProtectionEnabled, 
            isoCountryCode: isoCountryCode, 
            senderId: senderId
        )
        return try await self.updateSenderId(input, logger: logger)
    }

    /// Use the verification code that was received by the verified destination phone number to opt-in the verified destination phone number to receive more messages.
    @Sendable
    @inlinable
    public func verifyDestinationNumber(_ input: VerifyDestinationNumberRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> VerifyDestinationNumberResult {
        try await self.client.execute(
            operation: "VerifyDestinationNumber", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Use the verification code that was received by the verified destination phone number to opt-in the verified destination phone number to receive more messages.
    ///
    /// Parameters:
    ///   - verificationCode: The verification code that was received by the verified destination phone number.
    ///   - verifiedDestinationNumberId: The unique identifier for the verififed destination phone number.
    ///   - logger: Logger use during operation
    @inlinable
    public func verifyDestinationNumber(
        verificationCode: String,
        verifiedDestinationNumberId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> VerifyDestinationNumberResult {
        let input = VerifyDestinationNumberRequest(
            verificationCode: verificationCode, 
            verifiedDestinationNumberId: verifiedDestinationNumberId
        )
        return try await self.verifyDestinationNumber(input, logger: logger)
    }
}

extension PinpointSMSVoiceV2 {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: PinpointSMSVoiceV2, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}
